Un sémaphore est adapté proprement à un producteur-consommateur modèle, même s'il a d'autres utilisations. La logique du programme est responsable de s'assurer que le nombre de posts pour le nombre de périodes d'attente. Si vous postez un sémaphore, et personne n'est en attente pour l'instant, alors quand ils le font attendre, ils continuent immédiatement. Si votre problème est telle qu'elle peut être expliqué en termes de nombre de la valeur d'un sémaphore, alors il devrait être facile à résoudre avec un sémaphore.
Une variable de condition est un peu plus indulgent à certains égards. Vous pouvez par exemple utiliser cond_broadcast réveiller tous les serveurs, sans que le producteur de savoir combien elles sont. Et si vous cond_signal un condvar avec personne d'attente sur elle, puis rien ne se passe. C'est bien si vous ne savez pas si il va y avoir un auditeur intéressé. C'est aussi pourquoi l'auditeur doit toujours vérifier l'état avec le mutex lieu avant l'attente - si ils ne le font pas alors qu'ils peuvent se passer d'un signal et pas de réveil jusqu'à la prochaine (qui peut-être jamais).
Si une variable de condition est adapté pour informer les parties intéressées que l'état a changé: vous pouvez acquérir le mutex, modifier l'état de signal (ou de diffusion) la condvar et de libérer le mutex. Si cela décrit votre problème, vous êtes dans condvar territoire. Si différents auditeurs sont intéressés par différents états, vous pouvez diffuser et ils vont chacun à leur tour se réveiller, à voir si ils ont trouvé à l'état qu'ils veulent, et si ce n'est attendre de nouveau.
Il est très ardu en effet de tenter ce genre de chose avec un mutex et sémaphore. Le problème vient quand vous voulez prendre le mutex, vérifiez certains de l'état, puis attente sur le sémaphore pour les changements. Sauf si vous pouvez atomiquement libérer le mutex et d'attente sur le sémaphore (qui, dans les pthreads vous ne pouvez pas vous), vous vous retrouver en attente sur le sémaphore tout en maintenant le mutex. Ce qui bloque le mutex, ce qui signifie que les autres ne peuvent pas le prendre pour faire le changement vous vous souciez. Ainsi, vous serez tenté d'ajouter un autre mutex dans une manière qui dépend de vos besoins spécifiques. Et peut-être un autre sémaphore. Le résultat est généralement un code incorrect par des conditions de course.
Les variables de Condition échapper à ce problème, car l'appel de cond_wait libère le mutex, en la libérant pour une utilisation par d'autres. Le mutex est retrouvé avant cond_wait retourne.
IIRC, il est possible de mettre en œuvre une sorte de condvar en utilisant uniquement les sémaphores, mais si le mutex vous êtes en œuvre pour aller avec le condvar est nécessaire d'avoir trylock, puis c'est une grave à la tête-scratcher, et programmer les temps d'attente sont out. Pas recommandé. Donc, ne pas supposer que tout ce que vous pouvez faire avec un condvar peut être fait avec des sémaphores. Plus bien sûr les mutex peuvent avoir agréable de comportements que les sémaphores manque, principalement priorité inversion de l'évitement.