Operador Barreira
O objetivo deste projeto é construir uma primitiva de sincronização entre threads denominada “barreira” (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:
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 este código e gerar uma saida similar a 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: