Objets Mutex
Un objet mutex est un objet de synchronisation dont l’état est défini sur signalé lorsqu’il n’appartient à aucun thread et non signé lorsqu’il appartient. Un seul thread à la fois peut posséder un objet mutex, dont le nom provient du fait qu’il est utile de coordonner l’accès mutuellement exclusif à une ressource partagée. Par exemple, pour empêcher l’écriture de deux threads en mémoire partagée en même temps, chaque thread attend la propriété d’un objet mutex avant d’exécuter le code qui accède à la mémoire. Après avoir écrit dans la mémoire partagée, le thread libère l’objet mutex.
Un thread utilise la fonction CreateMutex ou CreateMutexEx pour créer un objet mutex. Le thread de création peut demander la propriété immédiate de l’objet mutex et peut également spécifier un nom pour l’objet mutex. Il peut également créer un mutex sans nom. Pour plus d’informations sur les noms des objets mutex, event, sémaphore et minuteur, consultez de synchronisation interprocess.
Les threads d’autres processus peuvent ouvrir un handle à un objet mutex nommé existant en spécifiant son nom dans un appel à la fonction OpenMutex. Pour passer un handle à un mutex sans nom à un autre processus, utilisez la fonction DuplicateHandle ou l’héritage du handle parent-enfant.
Tout thread avec un handle vers un objet mutex peut utiliser l’une des fonctions d’attente demander la propriété de l’objet mutex. Si l’objet mutex appartient à un autre thread, la fonction d’attente bloque le thread demandeur jusqu’à ce que le thread propriétaire libère l’objet mutex à l’aide de la fonction ReleaseMutex. La valeur de retour de la fonction d’attente indique si la fonction retournée pour une raison autre que l’état du mutex défini sur signalé.
Si plusieurs threads attendent un mutex, un thread en attente est sélectionné. Ne supposez pas une commande fiFO (first-out). Les événements externes tels que les API en mode noyau peuvent modifier l’ordre d’attente.
Une fois qu’un thread obtient la propriété d’un mutex, il peut spécifier le même mutex dans les appels répétés aux fonctions d’attente sans bloquer son exécution. Cela empêche un thread d’interblocage lui-même en attendant qu’un mutex qu’il possède déjà. Pour libérer sa propriété dans de telles circonstances, le thread doit appeler ReleaseMutex une fois pour chaque fois que le mutex satisfait les conditions d’une fonction d’attente.
Si un thread se termine sans libérer sa propriété d’un objet mutex, l’objet mutex est considéré comme abandonné. Un thread en attente peut acquérir la propriété d’un objet mutex abandonné, mais la fonction d’attente retourne WAIT_ABANDONED pour indiquer que l’objet mutex est abandonné. Un objet mutex abandonné indique qu’une erreur s’est produite et que toute ressource partagée protégée par l’objet mutex est dans un état non défini. Si le thread continue comme si l’objet mutex n’avait pas été abandonné, il n’est plus considéré comme abandonné après que le thread libère sa propriété. Cela restaure le comportement normal si un handle sur l’objet mutex est ensuite spécifié dans une fonction d’attente.
Notez que objets de section critique fournir une synchronisation similaire à celle fournie par des objets mutex, sauf que les objets de section critique peuvent être utilisés uniquement par les threads d’un seul processus.
Rubriques connexes