====== Operador Barreira ======
O objetivo deste projeto é construir uma primitiva de sincronização entre threads denominada "barreira" (//[[http://en.wikipedia.org/wiki/Barrier_%28computer_science%29|synchronization barrier]]//). Uma barreira permite realizar a sincronização conjunta de N threads, sendo por isso muito utilizada em ambientes de programação paralela e distribuída.
O comportamento de uma barreira é bem simples: a barreira deve ser inicializada com um valor N > 0. A partir desse momento, cada thread que "chegar à barreira" ficará suspensa até que N threads tenham chegado à barreira. Nesse momento, a barreira é reiniciada e as N threads saem do estado suspenso e voltam para a fila de prontas. O diagrama a seguir ilustra esse comportamento:
{{ barrier.png |}}
As funções a implementar são indicadas a seguir.
==== Inicializa uma barreira ====
int barrier_init (barrier_t *b, int N)
Inicializa uma barreira indicada por ''b'' para N tarefas (N > 0). Retorna 0 em caso de sucesso ou -1 em caso de erro.
==== Chega a uma barreira ====
int barrier_join (barrier_t *b)
Permite a uma tarefa indicar que chegou à barreira representada por ''b''. Esta chamada é bloqueante caso o limite da barreira ainda não tenha sido atingido. Retorna 0 em caso de sucesso ou -1 em caso de erro (barreira inexistente ou destruída).
==== Destrói uma barreira ====
int barrier_destroy (barrier_t *b)
Destrói a barreira indicada por ''b'', liberando todas as tarefas que eventualmente esperam nela (essas tarefas devem retornar da espera com um código de erro). Retorna 0 em caso de sucesso ou -1 em caso de erro.
===== Observações =====
Sua implementação deverá funcionar com {{pingpong-barrier.c|este código}} e gerar uma saida similar a {{pingpong-barrier.txt|este exemplo}}. Este projeto faz uso da chamada ''task_sleep'', que deve estar funcionando corretamente.
Use os semáforos anteriormente implementados ou o controle de preempções para evitar condições de disputa envolvendo as variáveis internas da barreira.
===== Outras informações =====
* Duração estimada: 4 horas.
* Dependências:
* [[Gestão de Tarefas]]
* [[Dispatcher]]
* [[Preempção por Tempo]]
* [[Tarefa Main]]
* [[Tarefas suspensas]]
* [[Tarefas dormindo]]
* [[Semáforos]]