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