Mea culpa, il faut en effet que qu'il y ait un thread en attente au moment du signal, sinon il est perdu.
C'est pourquoi on utilise un booléen ou un indicateur dans la variable à transmettre.
Tu peux aussi utiliser un unique mutex pour les 4 cond_var
1 2 3 4 5 6 7
| pthread_mutex_lock( &uniqueVerrou );
for ( int i = 0 ; i < 4 ; ++i ) {
while ( variable[i] == 0 ) // si pas déjà là, attendre et revérifier (un if suffit dans ton cas, mais while est préférable)
pthread_cond_wait( &conditions[i] , &uniqueVerrou );
// ... lecture des données transmises .... (protégée par le verrou)
}
pthread_mutex_unlock( &uniqueVerrou ); |
Et pour le signal, le verrou permet de protéger le remplissage de la donnée signalée.
1 2 3 4 5 6 7 8 9
| void * monThread(void * arg){
... CODE DU THREAD ...
pthread_mutex_lock( verrousParametre );
*pvariableParametre = 1; // + éventuellement écriture d'autres données protégées
pthread_cond_signal( conditionParametre );
pthread_mutex_unlock( verrousParametre );
} |
Et les variables doivent être déclarées par
volatile int variable[4] = {0,0,0,0};
Partager