/* * Implementação do algoritmo Black-White Bakery. * Autor: Daniel Bruno Alves dos Santos * E-mail: danielbrunoalves@gmail.com * */ #include #include #include #include #define N 10 /* Número de threads */ #define N_VEZES 10 /* Número de acessos por thread à região crítica */ volatile int s = 0; /* Variável compartilhada */ volatile int num[N]; /* Vetor de senhas */ volatile int escolhendo[N]; volatile int minha_cor[N]; volatile int cor = 0; //bit indicando as cor do ticket: 0 preto, 1 branco. Inicialmente a cor é branca /* Retorna o valor máximo presente no vetor num */ int max(int thread_id) { int j, m = 0; for (j = 0; j < N; j++) if (m < num[j] && minha_cor[j] == minha_cor[thread_id]) m = num[j]; return m; } /* Função executada pelas threads */ void* f_thread(void *v) { int thr_id = *(int *)v; int i, j, aux; for (i = 0; i < 10; i++) { escolhendo[thr_id] = 1; minha_cor[thr_id] = cor; // seta a cor da senha aux = max(thr_id) + 1; /* Calcula senha */ sleep(3); num[thr_id] = aux; escolhendo[thr_id] = 0; for (j = 0; j < N; j++) { while (escolhendo[j]); if (minha_cor[j] == minha_cor[thr_id]) { while (num[j] != 0 && (num[j] < num[thr_id] || (num[j] == num[thr_id] && j < thr_id)) && minha_cor[j] == minha_cor[thr_id]); } else { while ( (num[j] != 0) && (minha_cor[j] == cor) && (minha_cor[j] == minha_cor[thr_id]) ); } } s = thr_id; sleep(1); printf("Thread %d, s = %d, Cor = %d.\n", thr_id, s, minha_cor[thr_id]); if (minha_cor[thr_id] == 0) cor = 1; else cor = 0; num[thr_id] = 0; /* Marca que saiu da região crítica */ //sleep(1); } return NULL; } int main() { pthread_t thr[N]; int i, id[N]; for (i = 0; i < N; i++) num[i] = 0; 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); getchar(); return 0; }