====== 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]]