FUTEX_WAKE: 最多唤醒val个等待在uaddr上进程。
#include <sys/atomics.h>
#include<sys/mman.h>
volatile int * lock;
extern int futex (volatile int *uaddr, int op, int val, const struct timespec *timeout,int *uaddr2, int val3);
function init_lock() {
int fd = open("/lock", O_RDWR);
if (fd > 0) {
lock = (int*)mmap(0, 4, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, g_fd, 0);
if (lock)
lock[0] = 1;
}
}
}
void mutex_lock(volatile int *lock) {
futex(lock, FUTEX_WAIT, 0, 0, 0, 0);
__atomic_dec(lock);
}
void mutex_unlock(volatile int *lock) {
__atomic_inc(lock);
futex(lock, FUTEX_WAKE, 1, 0, 0, 0);
}