2009-07-09 7 views
8

Avec un pthread_cond_t nous devons associer un mutex, lorsque la signalisation l'état où j'ai vu le code tel queappel pthread_cond_broadcast avec mutex tenu ou non?

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_cond_broadcast(&cond); 
pthread_mutex_unlock(&mutex); 

et

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_mutex_unlock(&mutex); 
pthread_cond_broadcast(&cond); 

Laquelle est la bonne façon? (Est-ce important?)

Répondre

13

Dépend de ce que font les puits (et d'autres sources).

Dans votre deuxième exemple de code, il est possible que, entre le déverrouillage et la diffusion, un tas d'autres threads viennent et font une combinaison de choses qui rend la condition fausse à nouveau. Vous diffuserez alors inutilement. Et vous n'aurez pas nécessairement le même groupe de serveurs que lorsque vous avez changé la condition, ce qui peut affecter ou non votre conception. Un lavabo décent ne devrait pas se soucier s'il est éveillé et la condition est fausse, surtout si vous utilisez broadcast. Tant que chaque changement de condition à "vrai" est finalement suivi par une diffusion, je suis assez sûr qu'avec des récepteurs correctement écrits, vous pouvez diffuser une variable de condition avec ou sans le verrou. Donc, je ne pense pas que ce soit vraiment important, mais personnellement je diffuserais avec le verrou tenu, ne serait-ce que pour ne pas avoir à m'inquiéter à ce sujet. "Atomic change-and-signal" pourrait simplifier le diagramme d'état sur votre tableau blanc par rapport à "changer ... quelque temps plus tard, le signal". Les deux sont corrects (contrairement à l'attente sans le mutex, ce qui n'est pas autorisé), mais je ne pense pas qu'il serait trop difficile de trouver des utilisations qui peuvent mal se passer dans le second cas, cela ne serait pas aller mal dans le premier. Ils devraient probablement impliquer des serveurs faisant des choses un peu inhabituelles, cependant. La spécification dit de façon plutôt énigmatique "si un comportement de planification prévisible est requis, alors ce mutex doit être verrouillé par le thread appelant pthread_cond_broadcast() ou pthread_cond_signal()."

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_signal.html

+0

Ayant la même question, j'ai trouvé votre réponse. J'ai suivi votre lien et je pense que le bit que vous avez cité est lié au bit précédent: "Si plus d'un thread est bloqué sur une variable de condition, la politique d'ordonnancement doit déterminer l'ordre dans lequel les threads sont débloqués." – wilx

+0

@wilx: oui, ce qui m'inquiète, c'est ce qui est permis par un "comportement d'ordonnancement imprévisible". Par exemple, supposons que vous ayez un planificateur documenté ou ayant une option, que les mutex et les variables de condition choisissent le thread à réveiller sur une base FIFO. La phrase "cryptique" implique-t-elle que le comportement ne devrait pas être FIFO si un appelant de "pthread_cond_signal" ne détient pas le mutex? Je le pense, mais je ne connais pas la définition formelle de «prévisible», c'est pourquoi je trouve cela énigmatique. Sauf dans un système RT, je considère toujours l'ordonnancement comme un peu imprévisible, mais je ne veux pas que ça devienne bizarre. –

+0

Il n'y a aucun cas connu où il importe que votre diffusion avant ou après le déverrouillage. Avec beaucoup de difficulté, on peut construire un code qui se casse si vous déplacez un signal après un déverrouillage. –