Je suis en train d'apprendre le pthread et les conditions d'attente. D'après ce que je sais, un fil d'attente typique ressemble à ceci :
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Ce que je ne comprends pas, c'est pourquoi la ligne while(!condition)
est nécessaire même si j'utilise pthread_cond_signal()
pour réveiller le fil.
Je peux comprendre que si j'utilise pthread_cond_broadcast()
J'ai besoin de tester la condition, parce que je me réveille tous threads en attente et l'un d'entre eux peut rendre la condition fausse à nouveau avant de déverrouiller le mutex (et ainsi transférer l'exécution à un autre thread réveillé qui ne devrait pas s'exécuter à ce moment-là). Mais si j'utilise pthread_cond_signal()
Je me réveille juste un donc la condition doit être vraie. Le code pourrait donc ressembler à ceci :
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
J'ai lu quelque chose sur les signaux parasites qui peuvent se produire. Est-ce que c'est (et seulement cela) la raison ? Pourquoi devrais-je avoir des signaux parasites ? Ou y a-t-il autre chose que je ne comprends pas ?
Je suppose que le code du signal est comme ça :
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);