Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
so:operador_barreira [2023/03/29 16:12] mazieroso:operador_barreira [2023/05/25 16:11] (atual) – [Inicializa uma barreira] maziero
Linha 1: Linha 1:
 +====== 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 ====
 +
 +<code c>
 +int barrier_init (barrier_t *b, int N)
 +</code>
 +
 +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 ====
 +
 +<code c>
 +int barrier_join (barrier_t *b)
 +</code>
 +
 +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 ====
 +
 +<code c>
 +int barrier_destroy (barrier_t *b)
 +</code>
 +
 +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]]