Partage via


Mutex

Vous pouvez utiliser un objet Mutex pour octroyer un droit d’accès exclusif à une ressource. La classe Mutex utilise davantage de ressources système que la classe Monitor. Cependant, elle peut être marshalée au-delà des limites du domaine d’application et utilisée avec plusieurs attentes, ainsi que pour synchroniser des threads dans différents processus. Pour consulter une comparaison des mécanismes de synchronisation gérés, consultez Vue d’ensemble des primitives de synchronisation.

Pour obtenir des exemples de code, consultez la documentation de référence destinée aux constructeurs Mutex.

Utiliser des mutex

Un thread appelle la méthode WaitOne d’un mutex pour demander la propriété. L’appel est bloqué jusqu'à ce que le mutex soit disponible, ou jusqu'à ce que le délai d’expiration facultatif s’écoule. L’état d’un mutex est signalé si aucun thread ne le possède.

Un thread libère un mutex en appelant sa méthode ReleaseMutex. Les mutex ont une affinité de thread. Cela signifie que le mutex ne peut être libéré que par le thread qui le possède. Si un thread libère un mutex qu’il ne possède pas, une exception cas, une ApplicationException est levée dans le thread.

La classe Mutex dérive de la classe WaitHandle, vous pouvez également appeler les méthodes statiques WaitAll ou WaitAny de WaitHandle pour demander la propriété d’un Mutex en combinaison avec d’autres descriptifs d’attente.

Si un thread possède un Mutex, il peut spécifier le même Mutex dans les appels d’attente-demande répétés sans en bloquer l’exécution. Toutefois, il doit libérer le Mutex à chaque fois pour libérer la propriété.

Mutex abandonnés

Si un thread se termine sans libérer un Mutex, le mutex est considéré comme abandonné. Cela indique souvent une grave erreur de programmation, car la ressource que le mutex protège peut être laissée dans un état incohérent. Un AbandonedMutexException est levée dans le thread suivant qui acquiert le mutex.

Si le mutex est développé au niveau système, et qu’il est abandonné, cela peut indiquer qu’une application a été arrêtée soudainement (par exemple, à l’aide du Gestionnaire des tâches de Windows).

Mutex système et locaux

Il existe deux types de mutex : les mutex locaux et les mutex système nommés. Si vous créez un objet Mutex à l’aide d’un constructeur qui accepte un nom, le mutex est associé à un objet de système d’exploitation portant ce nom. Les mutex système nommés sont visibles partout dans le système d’exploitation, et peuvent être utilisés pour synchroniser les activités de processus. Vous pouvez créer plusieurs objets Mutex qui représentent le même mutex de système nommé, et vous pouvez utiliser la méthode OpenExisting pour ouvrir un mutex de système nommé existant.

Un mutex local existe uniquement dans votre processus. Il peut être utilisé par tout thread de votre processus qui a une référence à l’objet Mutex local. Chaque objet Mutex est un mutex local séparé.

Sécurité du contrôle d'accès pour les mutex système

.NET Framework permet de demander et de définir la sécurité de contrôle d’accès Windows pour les objets système nommé. Il est recommandé de protéger les mutex système dès leur création, car les objets système sont globaux et peuvent donc être verrouillés par un code autre que le vôtre.

Pour plus d’informations sur la sécurité du contrôle d’accès pour les mutex, consultez les classes MutexSecurity et MutexAccessRule, l’énumération MutexRights, les méthodes GetAccessControl, SetAccessControl et OpenExisting de la classe Mutex et le constructeur Mutex(Boolean, String, Boolean, MutexSecurity).

Notes

La sécurité du contrôle d’accès pour les mutex système est disponible uniquement avec .NET Framework, elle n’est pas disponible avec .NET Core ou .NET 5+.

Voir aussi