Pour citer la page de manuel:
Lors de l'utilisation de variables de condition, il existe toujours un prédicat booléen impliquant des variables partagées associées à chaque condition d'attente qui est vrai si le thread doit continuer. Des réveils parasites des fonctions pthread_cond_timedwait () ou pthread_cond_wait () peuvent se produire. Puisque le retour de pthread_cond_timedwait () ou pthread_cond_wait () n'implique rien sur la valeur de ce prédicat, le prédicat doit être réévalué lors d'un tel retour.
Donc, pthread_cond_wait
peut revenir même si vous ne l'avez pas signalé. À première vue du moins, cela semble assez atroce. Ce serait comme une fonction qui retournait aléatoirement la mauvaise valeur ou renvoyée aléatoirement avant d'atteindre réellement une instruction de retour correcte. Cela semble être un bug majeur. Mais le fait qu'ils aient choisi de documenter cela dans la page de manuel plutôt que de corriger cela semble indiquer qu'il y a une raison légitime pour laquelle pthread_cond_wait
finit par se réveiller de manière indue. Vraisemblablement, il y a quelque chose d'intrinsèque dans son fonctionnement qui fait que cela ne peut pas être aidé. La question est de savoir quoi.
Pourquoi ne pthread_cond_wait
revenir spuriously? Pourquoi ne peut-il pas garantir qu'il ne se réveillera que lorsqu'il aura été correctement signalé? Quelqu'un peut-il expliquer la raison de son comportement faux?
pthread_cond_(timed)wait
: "Si un signal est délivré ... le thread recommence à attendre la variable de condition comme si c'était pas interrompu, ou il doit retourner zéro en raison d'un faux réveil ". D'autres fonctions de blocage indiquent EINTR
lorsqu'elles sont interrompues par un signal (par exemple read
), ou doivent reprendre (par exemple pthread_mutex_lock
). Donc, s'il n'y avait pas d'autres raisons pour un faux réveil, cela pthread_cond_wait
aurait pu être défini comme l'un ou l'autre.