/* * Campeonato entre 4 threads. */ #include #include #include #include volatile int s = 0; int vez_final = 0; int inter_final[2] = { 0, 0 }; int vez_elim [2] = {0, 0}; int inter_elim[4] = { 0, 0, 0, 0}; void* f_thread(void *v) { int id, bit0, bit1; int pos_elim, adv_elim, pos_final, adv_final; int i; id = *(int *) v; bit0 = id & 1; bit1 = (id >> 1); pos_elim = id; adv_elim = bit1 * 2 + ( 1 - bit0); pos_final = bit1; adv_final = 1 - bit1; for (i = 0; i < 20; i++) { inter_elim[pos_elim] = 1; vez_elim[pos_final] = id; while (vez_elim[pos_final] == id && inter_elim[adv_elim]) ; sleep(1); inter_final[pos_final] = 1; vez_final = id; while (vez_final == id && inter_final[adv_final]) ; sleep(1); s = id; printf("Thread %d, s = %d.\n", id, s); inter_final[pos_final] = 0; inter_elim[pos_elim] = 0; } return NULL; } int main() { pthread_t thr[4]; int id[4]; int i; for (i = 0; i < 4; i++) { id[i] = i; pthread_create(&thr[i], NULL, start_thread, (void*) &id[i]); } for (i = 0; i < 4; i++) pthread_join(thr[i], NULL); return 0; }