MutexMutexes

Vous pouvez utiliser un objet Mutex pour octroyer un droit d’accès exclusif à une ressource.You can use a Mutex object to provide exclusive access to a resource. 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.The Mutex class uses more system resources than the Monitor class, but it can be marshaled across application domain boundaries, it can be used with multiple waits, and it can be used to synchronize threads in different processes. Pour consulter une comparaison des mécanismes de synchronisation gérés, consultez Vue d’ensemble des primitives de synchronisation.For a comparison of managed synchronization mechanisms, see Overview of Synchronization Primitives.

Pour obtenir des exemples de code, consultez la documentation de référence destinée aux constructeurs Mutex.For code examples, see the reference documentation for the Mutex constructors.

Utilisation de mutexUsing Mutexes

Un thread appelle la méthode WaitOne d’un mutex pour demander la propriété.A thread calls the WaitOne method of a mutex to request ownership. L’appel est bloqué jusqu'à ce que le mutex soit disponible, ou jusqu'à ce que le délai d’expiration facultatif s’écoule.The call blocks until the mutex is available, or until the optional timeout interval elapses. L’état d’un mutex est signalé si aucun thread ne le possède.The state of a mutex is signaled if no thread owns it.

Un thread libère un mutex en appelant sa méthode ReleaseMutex.A thread releases a mutex by calling its ReleaseMutex method. 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.Mutexes have thread affinity; that is, the mutex can be released only by the thread that owns it. Si un thread libère un mutex qu’il ne possède pas, une exception cas, une ApplicationException est levée dans le thread.If a thread releases a mutex it does not own, an ApplicationException is thrown in the 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.Because the Mutex class derives from WaitHandle, you can also call the static WaitAll or WaitAny methods of WaitHandle to request ownership of a Mutex in combination with other wait handles.

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é.If a thread owns a Mutex, that thread can specify the same Mutex in repeated wait-request calls without blocking its execution; however, it must release the Mutex as many times to release ownership.

Mutex abandonnésAbandoned Mutexes

Si un thread se termine sans libérer un Mutex, le mutex est considéré comme abandonné.If a thread terminates without releasing a Mutex, the mutex is said to be abandoned. 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.This often indicates a serious programming error because the resource the mutex is protecting might be left in an inconsistent state. Dans la version 2.0 de .NET Framework, une AbandonedMutexException est levée dans le thread suivant qui acquiert le mutex.In the .NET Framework version 2.0, an AbandonedMutexException is thrown in the next thread that acquires the mutex.

Notes

Dans les versions 1.0 et 1.1 de .NET Framework, un Mutexabandonné est signalé et le thread en attente suivant en obtient la propriété.In the .NET Framework versions 1.0 and 1.1, an abandoned Mutex is set to the signaled state and the next waiting thread gets ownership. Si aucun thread n’est en attente, le Mutex reste signalé.If no thread is waiting, the Mutex remains in a signaled state. Aucune exception n'est levée.No exception is thrown.

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).In the case of a system-wide mutex, an abandoned mutex might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager).

Mutex système et locauxLocal and System Mutexes

Il existe deux types de mutex : les mutex locaux et les mutex système nommés.Mutexes are of two types: local mutexes and named system mutexes. 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.If you create a Mutex object using a constructor that accepts a name, it is associated with an operating-system object of that name. 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.Named system mutexes are visible throughout the operating system and can be used to synchronize the activities of processes. 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.You can create multiple Mutex objects that represent the same named system mutex, and you can use the OpenExisting method to open an existing named system mutex.

Un mutex local existe uniquement dans votre processus.A local mutex exists only within your process. Il peut être utilisé par tout thread de votre processus qui a une référence à l’objet Mutex local.It can be used by any thread in your process that has a reference to the local Mutex object. Chaque objet Mutex est un mutex local séparé.Each Mutex object is a separate local mutex.

Sécurité du contrôle d'accès pour les mutex systèmeAccess Control Security for System Mutexes

La version 2.0 de .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é.The .NET Framework version 2.0 provides the ability to query and set Windows access control security for named system objects. 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.Protecting system mutexes from the moment of creation is recommended because system objects are global and therefore can be locked by code other than your own.

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).For information on access control security for mutexes, see the MutexSecurity and MutexAccessRule classes, the MutexRights enumeration, the GetAccessControl, SetAccessControl, and OpenExisting methods of the Mutex class, and the Mutex(Boolean, String, Boolean, MutexSecurity) constructor.

Voir aussiSee also