/* * Controle da região crítica por alternância simples. * Altere o código para utilizar futexes. */ #include #include #include #include #include #include #include #include #include /* 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); } volatile int s = 0; /* Variável compartilhada */ volatile int vez = 0; /* Indica de qual thread é a vez de entrar na região crítica */ void* f_thread_0(void *v) { int i; for (i = 0; i < 5; i++) { while (vez != 0); /* Espera ser a vez desta thread */ s = 0; printf("Thread 0, s = %d.\n", s); vez = 1; /* Passa a vez para a outra thread */ } return NULL; } void* f_thread_1(void *v) { int i; for (i = 0; i < 5; i++) { while (vez != 1); /* Espera ser a vez desta thread */ s = 1; printf("Thread 1, s = %d.\n", s); vez = 0; /* Passa a vez para a outra thread */ } return NULL; } int main() { pthread_t thr0, thr1; pthread_create(&thr0, NULL, f_thread_0, NULL); pthread_create(&thr1, NULL, f_thread_1, NULL); pthread_join(thr0, NULL); pthread_join(thr1, NULL); return 0; }