La réponse rapide:
pthread_cond_signal()
se réveillera au moins un des fils qui est bloqué sur la variable de condition - mais plus que cela n'est pas garantie (pour référence, utilisez pthread_cond_broadcast()
de se réveiller tous les fils bloqués).
De here:
Le pthread_cond_signal() appel débloque au moins un des fils qui sont bloqués sur la condition spécifiée cond variable (le cas échéant threads sont bloqués sur cond).
L'appel pthread_cond_broadcast() débloque tous les threads actuellement bloqués sur la condition condition spécifiée.
La réponse plus longue:
Ainsi, selon le cahier des charges, je suppose que le débouchage se produire de manière synchrone, c'est un fil qui a été débloquée par le premier appel à pthread_cond_signal()
sera vu comme débloqué par le deuxième appel à pthread_cond_signal()
, et ainsi l'autre thread sera réveillé.
Cependant, je ne sais pas si c'est le cas pour votre implémentation pthread spécifique ou non (et le site web de la glibc est assez douteux pour le moment, donc il ne peut pas accéder au code à regarder).
Le wohlfuehlen non encore mis en œuvre, mais-il-est-en la spécification réponse:
Il convient de noter cependant, que la spécification récemment obtenu légèrement reformulée sur la façon dont le pthread_cond_signal()
et pthread_cond_broadcast()
déterminer quels threads sont réellement bloqués sur une variable de condition donnée, mais je présume que toutes les implémentations n'ont pas encore été rattrapées.
Une longue discussion sur le sujet peut être trouvé here, avec la nouvelle spécification être:
Le pthread_cond_broadcast() et pthread_cond_signal() Fonctions sont atomiquement déterminer quels fils, le cas échéant, sont bloqués sur la condition conditionnée variable cond.Cette détermination doit avoir lieu à un moment indéterminé au cours de l'appel pthread_cond_broadcast() ou pthread_cond_signal(). La fonction pthread_cond_broadcast() doit ensuite débloquer tous les threads . La fonction pthread_cond_signal() doit débloquer à au moins un de ces threads.
Ainsi, la conclusion: Sans être un interprète expert des spécifications, je dirais que le nouveau texte confirme l'hypothèse de ce qui se passe de manière synchrone - de sorte que deux appels consécutifs à pthread_cond_signal()
avec deux threads bloqués disponibles, seront réveille les deux fils.
Je ne suis pas sûr à 100% à ce sujet, donc si quelqu'un peut élaborer, n'hésitez pas à le faire.
Même s'il y a un thread en attente (dans le cas de deux postes d'observation), si le mutex est verrouillé à le moment du signal (s) personne ne va nulle part jusqu'à ce qu'il soit libéré. La meilleure question est, si vous verrouillez-signal-signal-déverrouillage, les deux reçoivent le signal * puis * quand le mutex est finalement déverrouillé et chacun peut l'acquérir, le relâcher, et permettre le * autre * fil la même liberté? Honnêtement, je ne sais pas. – WhozCraig
Je pense que @WhozCraig a posé exactement ma question. Je suppose qu'une autre façon de demander est, étant donné ce que j'ai dit dans le post original, cela signifie-t-il que les deux threads seront finalement éveillés (si le mutex est déverrouillé correctement) puisque le parent a appelé pthread_cond_signal deux fois? – protossor
Ah oui - j'étais un peu trop rapide pour répondre je suppose;) Je vais mettre à jour ce qui précède ... – sonicwave