/* * Campeonato entre 4 threads para acesso à região crítica. * * Modifique este código para funcionar para N threads, * com apenas uma função f_thread. * * Deve ser colocado um comando sleep nos seguintes pontos: * - entre as partidas; * - entre a atribuição à variável s e a impressão do * valor desta variável; * - fora da região crítica. */ #include #include #include #include /* Número de vezes que uma thread deve entrar na região crítica. */ #define N_VEZES 15 /* Variável compartilhada */ volatile int s = 0; struct partida { int ultimo; int interesse[2]; }; struct campeonato { int ultimo; void * partidas[2]; }; struct campeonato camp = { .ultimo = ; .partidas = ; }; void protocolo_entrada(int i, struct partida* p) { } /* Função para a thread 0 */ void* f_thread_0(void *v) { int i; for (i = 0; i < N_VEZES; i++) { interesse_01[0] = 1; ultimo_01 = 0; while (ultimo_01 == 0 && interesse_01[1]) ; sleep(1); /* Sleep entre as partidas */ interesse_final[0] = 1; ultimo_final = 0; while (ultimo_final == 0 && interesse_final[1]) ; s = 0; sleep(1); /* Sleep entre a atribuição e a impressão */ printf("Thread 0, s = %d.\n", s); interesse_final[0] = 0; interesse_01[0] = 0; sleep(1); /* Sleep fora da região crítica */ } return NULL; } int main() { pthread_t thr0, thr1, thr2, thr3; pthread_create(&thr0, NULL, f_thread_0, NULL); pthread_create(&thr1, NULL, f_thread_1, NULL); pthread_create(&thr2, NULL, f_thread_2, NULL); pthread_create(&thr3, NULL, f_thread_3, NULL); pthread_join(thr0, NULL); pthread_join(thr1, NULL); pthread_join(thr2, NULL); pthread_join(thr3, NULL); return 0; }