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.

Foi útil?

Solução

Um thread pode ser executado várias vezes através da barreira enquanto outro thread não é executado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top