Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Vous pouvez utiliser un Mutex objet pour fournir un accès exclusif à une ressource. La classe Mutex utilise davantage de ressources système que la classe Monitor, mais elle peut être marshalée au-delà des limites du domaine d’application, utilisée avec plusieurs attentes et pour synchroniser des threads dans différents processus. Pour une comparaison des mécanismes de synchronisation managée, consultez Vue d’ensemble des primitives de synchronisation.
Pour obtenir des exemples de code, consultez la documentation de référence pour les Mutex constructeurs.
Utilisez 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, on dit que le mutex est abandonné. Cela indique souvent une erreur de programmation grave, car la ressource que le mutex protège peut être laissée dans un état incohérent. Un AbandonedMutexException est levé dans le thread suivant qui acquiert le mutex.
Dans le cas d’un mutex à l’échelle du système, un mutex abandonné peut indiquer qu’une application a été arrêtée brusquement (par exemple, à l’aide du Gestionnaire des tâches Windows).
Mutex locaux et système
Il existe deux types de mutex : les mutex locaux et les mutex système nommés. Si vous créez un Mutex objet à l’aide d’un constructeur qui accepte un nom, il est associé à un objet de système d’exploitation de 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. Elle peut être utilisée par n’importe quel thread de votre processus qui a une référence à l’objet local Mutex . Chaque Mutex objet est un mutex local distinct.
Sécurité du contrôle d’accès pour les mutex système
.NET Framework permet d’interroger et de définir la sécurité du contrôle d’accès Windows pour les objets système nommés. 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).
Remarque
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+.