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 est détenu. Un seul thread à la fois peut posséder un objet mutex, dont le nom vient du fait qu’il est utile pour coordonner l’accès mutuellement exclusif à une ressource partagée. Par exemple, pour empêcher deux threads d’écrire dans la 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 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 de handle parent-enfant.

Tout thread avec un handle pour un objet mutex peut utiliser l’une des fonctions d’attente pour demander la propriété de l’objet mutex. Si l’objet mutex appartient à un autre thread, la fonction wait 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 wait 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 (premier entré, premier sorti). 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 de se bloquer pendant l’attente d’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 a rempli 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 wait 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é une fois que le thread a libéré sa propriété. Cela rétablit le comportement normal si un handle de l’objet mutex est ensuite spécifié dans une fonction d’attente.

Notez que les objets de section critiques fournissent une synchronisation similaire à celle fournie par les objets mutex, sauf que les objets de section critiques ne peuvent être utilisés que par les threads d’un seul processus.

Utilisation d’objets Mutex