2013-03-18 5 views
11

Ceci est une question générale. Par exemple, actuellement, deux threads enfants ont appelé pthread_cond_wait(&cond1,&mutex) et ils attendent tous les deux. Ensuite, les appels thread parentEst-il garanti que pthread_cond_signal réveillera un thread en attente?

pthread_cond_signal(&cond1); 
pthread_cond_signal(&cond1); 

Ensuite, ma question est, est-il garanti que les deux deux threads en attente va obtenir pris conscience? (Supposons que le premier fil pris conscience de presse mutex plus tard, à un certain stade de l'exécution si que le deuxième fil peut l'acquérir). La raison pour laquelle je pose cette question est que, pour le signal de niveau système unix, le signal (disons SIGCHLD) n'est pas mis en file d'attente de sorte que plusieurs signaux de même type peuvent être perdus s'ils sont délivrés consécutivement. Donc je me demande si pthread_cond_signal est implémenté différemment pour ne pas être perdu si le planificateur arrive à laisser le thread filer deux fois de suite?

Répondre

12

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.

+1

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

+0

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

+0

Ah oui - j'étais un peu trop rapide pour répondre je suppose;) Je vais mettre à jour ce qui précède ... – sonicwave

0

Je sais que c'est un vieux fil (sans jeu de mots), mais une mise en oeuvre typique fonctionne comme ceci:

Une variable condition aura en son sein une file d'attente de threads qui sont actuellement endormis, en attendant pour obtenir signalé. Un verrou aura une queue de threads qui ont été mis en veille parce qu'ils ont tenté de l'acquérir mais il a été maintenu par un autre thread. Cond_wait ajoute le thread en cours d'exécution à la file d'attente de la variable d'état, libère le verrou et se met en veille. Cond_signal déplace simplement un thread dormant de la file d'attente de la variable de condition vers la file d'attente du verrou. Lorsque le thread en cours libère le verrou, un thread dormant est retiré de la file d'attente du verrou, la propriété du verrou est transférée à ce thread dormant et ce thread dormant est éveillé.

Ne demandez pas pourquoi ma spec dit qu'un cond_signal pourrait se réveiller plus d'un fil ...

Questions connexes