Pourquoi est-il nécessaire de verrouiller un mutex avant d'appeler pthread_cond_wait?
Parce que sinon il y a une condition de course inévitable.
Un mutex protège l'état partagé. Une variable de condition est associée à un prédicat ("condition") sur l'état. L'idée de base est que vous voulez:
1) vérifier le prédicat
2) si le prédicat est faux, allez dormir jusqu'à ce qu'il devienne vrai
Dans un système concurrent, il est toujours possible pour un thread pour rendre le prédicat vrai entre (1) et (2). Pour éviter cette course, vous devez tenir un mutex avant (1) et vous devez le relâcher atomiquement pendant que vous effectuez (2).
Par exemple, pour une file d'attente, le prédicat peut être "la file d'attente n'est pas vide". Mais entre le moment où vous vérifiez pour voir si la file d'attente est non-vide et le moment où vous allez dormir, un autre thread pourrait ajouter quelque chose à la file d'attente.
Ainsi, vous devez maintenir le mutex à la fois lors de la vérification du prédicat et au moment où vous appelez pthread_cond_wait.
De même, est-il nécessaire de prendre un verrou (sur le même mutex) avant d'appeler pthread_cond_signal?
À ma connaissance, il n'y a pas de problème fondamental avec ceci; cela introduit simplement des inefficacités potentielles.
Là encore, quel que soit l'état partagé que vous modifiez (et donc que le prédicat est vrai) doit être protégé par un mutex. Donc, chaque fois que vous voulez pour signaler la condition, vous devez déjà tenir le mutex de toute façon.
Si vous libérez le mutex avant de signaler la condition, il est possible que le prédicat devienne faux entre les deux en raison de l'action d'un autre thread. Cette course ne cause pas d'échec car tout thread qui attend la condition doit vérifier de nouveau le prédicat de toute façon avant de continuer ... Mais pourquoi le mettre en difficulté?
Bottom line: Il suffit de suivre les instructions et vous n'avez même pas à penser à ces questions. :-)
Voir aussi: http://stackoverflow.com/questions/4544234/calling-pthread-cond-signal-without-locking-mutex – ninjalj