Mutex Pthread par groupe de threads

Je cherche la bonne solution pour protéger le groupe de threads, comme je le ferais normalement avec un seul thread, à savoir: les threads 1 et 2 peuvent verrouiller mutex M en même temps, ni mettre en veille ni mutex M. Le mutex M est opposé au thread 3. Ainsi, si le thread 3 verrouille le mutex alors qu’il est verrouillé par le thread 1 ou 2, ou par les deux, le thread 3 EST mis en veille. Si le thread 1 ou 2 verrouille le mutex alors qu’il est verrouillé par le thread 3, alors 1 ou 2 (quel que soit le locking) met également en veille jusqu’à ce que 3 le relâche …

Je vous remercie.

si vous voulez dire que vous ne voulez jamais plus que deux threads dans une section critique, alors qu’un troisième thread est gardé en dehors de la section critique, vous devez utiliser un sémaphore POSiX initialisé à 2. Le compteur de sémaphore peut être initialisé à n’importe quelle valeur, chaque décrémentation de sem_wait le compteur (le verrouille), chaque sem_post l’incrémente (le relâche). Les mutex sont des cas particuliers de sémaphores initiés à 1.

Si vous voulez également un fil d’écriture et deux ou plusieurs lecteurs, vous pouvez utiliser rwlocks.

pourtant je dois lire sur le sémaphore suggéré (ce qui semble être ce que je veux), j’ai trouvé le moyen de le faire “à l’ancienne”: Stevens UNP p. 703, en utilisant pthread_cond, le métacode serait comme ceci:

 int var = 0; pthread_mutex_t M; pthread_cond_t C; threadA: lock M; var++; unlock M; do_job; lock M; var--; cond_signal(&C); unlock M threadB: lock M; var++; unlock M; do_job; lock M; var--; cond_signal(&C); unlock M thread Main: lock M; while (var > 0) cond_wait(&C, &M); do_protected_job; unlock M 

Peut-être que le sémaphore permet la même chose d’une manière moins lourde, je vais vérifier …