/* * Exemplo 1: FUTEX_WAKE. Thread 0 acorda thread 1. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include int futex_addr = 0; /* Retorna -1 se o futex não bloqueou e 0 caso contrário */ int futex_wait(void *addr, int val1) { return syscall(SYS_futex, addr, FUTEX_WAIT, val1, NULL, NULL, 0); } /* Retorna o número de threads que foram acordadas */ int futex_wake(void *addr, int n) { return syscall(SYS_futex, addr, FUTEX_WAKE, n, NULL, NULL, 0); } void* f_thread1(void *v) { futex_addr = 0; futex_wait(&futex_addr, 0); printf("Thread 1.\n"); return NULL; } void* f_thread0(void *v) { sleep(3); futex_wake(&futex_addr, 1); printf("Thread 0.\n"); return NULL; } int main() { pthread_t thr0, thr1; pthread_create(&thr0, NULL, f_thread0, NULL); pthread_create(&thr1, NULL, f_thread1, NULL); pthread_exit(0); }