Question

J'étudie l'algorithme de la barrière réutilisable du livre "The Little Book Of Semaphores", disponible ici http://greenteapress.com/semaphores/downey08semaphores.pdf

Le puzzle est à la page 31 (Modèles de synchronisation de base/Barrière réutilisable), et j'ai trouvé une « solution » (ou pas) qui diffère de la solution du livre (une barrière à deux phases).

Voici mon « code » pour chaque fil :

# 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

Cela semble fonctionner, j'ai même inséré différentes minuteries de mise en veille dans différentes sections des threads, et ils attendent toujours que tous les threads arrivent avant de continuer chaque boucle.Est-ce que j'ai raté quelque chose ?Y a-t-il une condition pour que cela échoue ?

J'ai implémenté cela en utilisant les fonctions Semaphore et Mutex de la bibliothèque Windows.

Mise à jour:

Merci de bleu étoile pour la réponse.Il s'avère que si, pour une raison quelconque, un thread est lent entre mutex.release() et semaphore.wait() l'un des fils qui arrivent à semaphore.wait() après une boucle complète, il pourra refaire, car il restera l'un des N signaux inutilisés.

Et après avoir mis une commande Sleep pour le thread numéro 3, j'ai obtenu ce résultat http://pastebin.com/raw.php?i=FfXcCMZ3 où l'on peut voir que le fil 3 a raté un tour la première fois, le fil 1 ayant fait 2 tours, puis rattrapé son retard au deuxième tour (qui était en fait son 1er tour).

Merci encore à tous pour votre contribution.

Était-ce utile?

La solution

Un thread peut passer plusieurs fois à travers la barrière tandis qu'un autre thread ne s'exécute pas du tout.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top