Partager via


Mutex

Mise à jour : novembre 2007

Vous pouvez utiliser un objet Mutex pour fournir l'accès exclusif à une ressource. La classe Mutex utilise plus de ressources de système que la classe Monitor, mais elle peut être marshalée à travers des limites de domaine d'application, elle peut être utilisée avec les attentes multiples, et elle peut être utilisée pour synchroniser des threads dans des processus différents. Pour une comparaison de mécanismes de synchronisation managés, consultez Vue d'ensemble des primitives de synchronisation.

Pour des exemples de code, consultez la documentation de référence pour les constructeurs Mutex.

Utilisation de 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 l'intervalle de 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 l'affinité du thread ; c'est-à-dire que le mutex peut être libéré uniquement par le thread qui le possède. Si un thread libère un mutex qu'il ne possède pas, une ApplicationException est levée dans le thread.

Étant donné que la classe Mutex dérive de WaitHandle, vous pouvez également appeler les méthodes WaitAll ou WaitAny statiques de WaitHandle pour demander la propriété d'un Mutex dans la combinaison avec d'autres handles d'attente.

Si un thread possède un Mutex, ce thread peut spécifier le même Mutex des appels d'attente-demande répétés sans bloquer son exécution ; il doit libérer le Mutex autant de fois en libérer la propriété.

Mutex abandonnés

Si un thread se termine sans libérer de Mutex, le mutex est dit 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. Dans .NET Framework version 2.0, une AbandonedMutexException est levée dans le thread suivant qui acquiert le mutex.

Remarque :

Dans .NET Framework versions 1.0 et 1.1, un Mutex abandonné a pour valeur l'état signalé et le prochain thread en attente obtient la propriété. Si aucun thread n'attend, le Mutex reste dans un état signalé. Aucune exception n'est levée.

Dans le cas d'un mutex à l'échelle du système, un mutex abandonné peut indiquer qu'une application s'est arrêtée soudainement (par exemple, à l'aide du Gestionnaire des tâches de Windows).

Mutex locaux et système

Les mutex sont de deux types : les mutex locaux et les mutex de systèmes nommés. Si vous créez un objet Mutex à l'aide d'un constructeur qui accepte un nom, il est associé à un objet de système d'exploitation portant ce nom. Les mutex de système nommé sont visibles dans la totalité du 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é ; vous pouvez également utiliser la méthode OpenExisting pour ouvrir un mutex de système nommé existant.

Un mutex local existe uniquement dans le cadre du processus concerné. Il peut être utilisé par tout thread du processus doté d'une référence à l'objet Mutex local. Chaque objet Mutex constitue un mutex local séparé.

Accéder à la sécurité du contrôle pour les mutex de système

.NET Framework version 2.0 fournit la capacité de demander et définir la sécurité du contrôle d'accès Windows pour les objets de système nommé. La protection de mutex de système du moment de création est recommandée parce que les objets système sont globaux et par conséquent peuvent être verrouillés par code autre que votre propre code.

Pour plus d'information sur la sécurité du contrôle d'accès pour 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).

Voir aussi

Concepts

Moniteurs

Threads et threading

Référence

Mutex

Mutex

MutexSecurity

MutexAccessRule

Autres ressources

Threading managé

Fonctionnalités et objets de threading