/* * Outra tentativa de implementar o algoritmo de Dekker para N theads. */ #include #include #include #include #define N 5 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[N] = {0, 0, 0, 0, 0}; /* Indica quais threads estão interessadas em entrar na região crítica */ volatile int esperando[N] = {0, 0, 0, 0, 0}; /* Indica quais threads estão esperando para entrar na região crítica */ int existe_outra_interessada(int thr_id) { int i; for (i = 0; i < N; i++) if (i != thr_id && interesse[i]) return 1; return 0; } int proxima_interessada(int thr_id) { int i; for (i = 0; i < N; i++) if (i != thr_id && interesse[i]) return i; return -1; } int minha_vez(int thr_id) { if (vez == thr_id) return 1; if (vez == -1) return 1; return 0; } void* f_thread(void *v) { int thr_id = *(int*)v; int i; for (i = 0; i < 5; i++) { interesse[thr_id] = 1; /* Marca que esta thread está interessada */ while (existe_outra_interessada(thr_id)) if (!minha_vez(thr_id)) { interesse[thr_id] = 0; while (!minha_vez(thr_id)); interesse[thr_id] = 1; } s = thr_id; printf("Thread %d, s = %d.\n", thr_id, s); vez = proxima_interessada(thr_id); /* Passa a vez para a outra thread */ interesse[thr_id] = 0; /* Marca que saiu da região crítica */ sleep(1); /* Deixa outra thread executar */ } return NULL; } int main() { pthread_t thr[N]; int id[N], i; for (i = 0; i < N; i++) { id[i] = i; pthread_create(&thr[i], NULL, f_thread, &id[i]); } for (i = 0; i < N; i++) pthread_join(thr[i], NULL); return 0; }