Algoritmo de Barreira Reutilizável
-
15-11-2019 - |
Pergunta
Estou pesquisando o algoritmo Reusable Barrier do livro "The Little Book Of Semaphores", disponível aqui http://greenteapress.com/semaphores/downey08semaphores.pdf
O quebra-cabeça está na página 31 (Padrões Básicos de Sincronização/Barreira Reutilizável), e eu encontrei uma 'solução' (ou não) que difere da solução do livro (uma barreira de duas fases).
Este é o meu 'código' para cada tópico:
# n = 4; threads running
# semaphore = n max., initialized to 0
# mutex, unowned.
start:
mutex.wait()
counter = counter + 1
if counter = n:
semaphore.signal(4) # add 4 at once
counter = 0
mutex.release()
semaphore.wait()
# critical section
semaphore.release()
goto start
Isso parece funcionar, eu até inseri diferentes temporizadores em diferentes seções dos threads, e eles ainda esperam que todos os threads cheguem antes de continuar cada loop.Estou esquecendo de algo?Existe uma condição de que isso falhe?
Eu implementei isso usando as funções Semaphore e Mutex da biblioteca do Windows.
Atualizar:
Obrigada por estrela azul para a resposta.Acontece que se por algum motivo um thread estiver lento entre mutex.release()
e semaphore.wait()
qualquer um dos threads que chegam semaphore.wait()
após um loop completo poderá passar novamente, pois restará um dos N sinais não utilizados.
E tendo colocado um comando Sleep para o thread número 3, obtive este resultado http://pastebin.com/raw.php?i=FfXcCMZ3 onde se pode ver que o fio 3 errou uma volta na primeira vez, com o fio 1 tendo feito 2 voltas, e depois alcançando a segunda volta (que foi na verdade a sua primeira volta).
Obrigado novamente a todos pela contribuição.
Solução
Um thread pode ser executado várias vezes através da barreira enquanto outro thread não é executado.