/* * Exemplo 2: FUTEX_WAKE. Thread 0 acorda N-1 threads. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #define N 10 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_thread(void *v) { futex_wait(&futex_addr, 0); printf("Thread %d.\n", (int) v); return NULL; } void* f_thread0(void *v) { sleep(5); futex_wake(&futex_addr, INT_MAX); /* ou N-1 */ printf("Thread 0.\n"); return NULL; } int main() { pthread_t thr[N]; int i; for (i=1; i < N; i++) pthread_create(&thr[i], NULL, f_thread, (void*) i); pthread_create(&thr[0], NULL, f_thread0, NULL); pthread_exit(0); }