Supposons qu'il y ait deux threads, le thread principal et le thread B (créé par main). Si B a acquis un mutex (disons pthread_mutex) et qu'il a appelé pthread_exit sans déverrouiller le verrou. Alors qu'arrive-t-il au mutex? Est-ce que ça devient gratuit?Qu'arrive-t-il à Mutex lorsque le thread qui l'a acquis existe?
Répondre
Si vous avez créé un mutex robuste en mettant en place les bons attributs avant d'appeler pthread_mutex_init
, le mutex entrera dans un état particulier lorsque le thread qui contient le verrou se termine, et le thread suivant pour tenter d'acquérir le mutex obtiendra une erreur de EOWNERDEAD
. Il est alors chargé de nettoyer l'état protégé par le mutex et d'appeler le pthread_mutex_consistent
pour rendre le mutex utilisable à nouveau, ou d'appeler le pthread_mutex_unlock
(ce qui rendra le mutex inutilisable en permanence, d'autres tentatives pour l'utiliser renverront ENOTRECOVERABLE
).
Pour les mutex non robustes, le mutex est définitivement inutilisable si le thread qui le bloque se termine sans le déverrouiller. Selon la norme (voir la résolution à issue 755 sur le tracker Austin Group), le mutex reste verrouillé et sa propriété formelle continue d'appartenir au thread qui a quitté, et tout thread qui tente de le verrouiller sera bloqué. Si un autre thread tente de le déverrouiller, c'est normalement un comportement indéfini, sauf si le mutex a été créé avec l'attribut PTHREAD_MUTEX_ERRORCHECK
, auquel cas une erreur sera renvoyée. D'autre part, de nombreuses implémentations (la plupart?) Du monde réel ne respectent pas les exigences de la norme. Une tentative de verrouillage ou de déverrouillage du mutex d'un autre thread peut réussir, car l'identifiant du thread (utilisé pour suivre la propriété) a pu être réutilisé et peut maintenant faire référence à un thread différent (probablement celui qui fait la nouvelle demande de verrouillage/déverrouillage). Au moins, NPTL de glibc est connu pour présenter ce comportement.
Merci Beaucoup !!! Merci beaucoup !!! – Sadish
Un autre thread ne peut pas le déverrouiller sauf s'il s'agit d'un mutex robuste. –
Whoa, un 'mutex' qui n'a pas d'affinité avec le fil? Aucun statut d'erreur "abandonné"? –