# 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 ```