Aula 07/05¶
Barreiras de sincronização¶
Usadas para garantir que todas as threads executaram, e todas terminaram sua execução em um dado momento.
Contador compartilhado¶
Usar um contador, que, quando, estiver com um valor igual ao numero de threds, a sincronização ocorreu.
int cont = 0
process worker[i = 1 to n]
while (true)
codigo_da_tarefa()
< cont = cont + 1 >
< await (cont == n) >
O codigo acima so funciona se eu quero fazer uma unica barreira com contador descartavel. Agora, se quero usar o mesmo contador, vou ter que utilizar, no minimo, tres Barreiras.
Flags e coordenadores¶
Usamos uma flag e um coordenador para garantir que todos os processos executaram
int cheguei[1:n] = ([n]0)
int continue[1:n] = ([n]0)
process Worker [i = 1 to n]
while (true)
codigo_tarefa_i()
cheguei[i] = 1
< await (continue[i] == 1) >
continue[i] = 0
process Coordinator
while (true)
for [i = 1 to n]
< await (cheguei[i] == 1) >
cheguei[i] = 0
for [i = 1 to n]
continue[i] = 1