/* * Simplificação do algoritmo de Dekker com bug. */ #include #include #include #include volatile int s = 0; /* Variável compartilhada */ volatile int vez = 1; /* Indica de qual thread tem prioridade entrar na região crítica */ volatile int interesse[2] = {0, 0}; /* Indica quais threads estão interessadas em entrar na região crítica */ volatile int rc[2] = {0, 0}; /* Indica que uma thread está na região crítica */ void* f_thread_0(void *v) { int i; for (i = 0; i < 10; i++) { interesse[0] = 1; /* Marca que esta thread está interessada */ while ((interesse[1] && vez != 0) || rc[1]) ; sleep(1); rc[0] = 1; /* Marca que entrou na região crítica */ s = 0; sleep(1); printf("Thread 0, s = %d.\n", s); vez = 1; /* Passa a vez para a outra thread */ interesse[0] = 0; rc[0] = 0; /* Marca que saiu da região crítica */ sleep(1); } return NULL; } void* f_thread_1(void *v) { int i; for (i = 0; i < 10; i++) { interesse[1] = 1; /* Marca que esta thread está interessada */ while ((interesse[0] && vez != 1) || rc[0]) ; rc[1] = 1; /* Marca que entrou na região crítica */ s = 1; sleep(1); printf("Thread 1, s = %d.\n", s); vez = 0; /* Passa a vez para a outra thread */ interesse[1] = 0; rc[1] = 0; /* Marca que saiu da região crítica */ sleep(1); /* Deixa a outra thread executar */ } 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; }