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.

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.

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).

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.

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.

  • so/operador_barreira.txt
  • Última modificação: 2023/05/25 16:11
  • por maziero