Mutexes

Puede usar un objeto Mutex para proporcionar acceso exclusivo a un recurso. La clase Mutex usa más recursos del sistema que la clase Monitor, pero se puede serializar mediante los límites de dominio de aplicación, se puede usar con varias esperas y se puede usar para sincronizar subprocesos en distintos procesos. Para ver una comparación de los mecanismos de sincronización administrados, consulte Información general sobre los primitivos de sincronización.

Para ver ejemplos de código, consulte la documentación de referencia para los constructores Mutex.

Uso de exclusiones mutuas

Un subproceso llama al método WaitOne de una exclusión mutua que solicite la propiedad. La llamada se bloquea hasta que está disponible la exclusión mutua o hasta que transcurre el intervalo de tiempo de espera opcional. El estado de una exclusión mutua se señala si no es propiedad de ningún subproceso.

Un subproceso libera una exclusión mutua mediante una llamada a su método ReleaseMutex. Las exclusiones mutuas tienen afinidad de subprocesos, es decir, solo el subproceso propietario de la exclusión mutua puede liberarla. Si un subproceso libera una exclusión mutua que no es de su propiedad, se genera ApplicationException en el subproceso.

Dado que la clase Mutex se deriva de WaitHandle, también puede llamar el método estático WaitAll o WaitAny de WaitHandle para solicitar la propiedad de Mutex en combinación con otros indicadores de espera.

Si un subproceso es propietario de Mutex, puede especificar la misma Mutex en llamadas repetidas de solicitud de espera sin bloquear su ejecución; sin embargo, debe liberar Mutex la misma cantidad de veces para liberar la propiedad.

Exclusiones mutuas abandonadas

Si un subproceso finaliza sin liberar Mutex, la exclusión mutua se considera abandonada. A menudo, esto indica un grave error de programación porque el recurso al que protege la exclusión mutua podría quedar con un estado no coherente. Se inicia una excepción AbandonedMutexException en el siguiente subproceso que adquiere la exclusión mutua.

En el caso de una exclusión mutua en todo el sistema, una exclusión mutua abandonada podría indicar que una aplicación finalizó inesperadamente (por ejemplo, con el Administrador de tareas de Windows).

Exclusiones mutuas locales y del sistema

Hay dos tipos de exclusiones mutuas: exclusiones mutuas locales y exclusiones mutuas del sistema con nombre. Si crea un objeto Mutex con un constructor que acepta un nombre, se asocia con un objeto del sistema operativo con ese nombre. Las exclusiones mutuas del sistema con nombre son visibles en todo el sistema operativo y se pueden usar para sincronizar las actividades de los procesos. Puede crear varios objetos Mutex que representen la misma exclusión mutua del sistema con nombre y puede usar el método OpenExisting para abrir una exclusión mutua del sistema con nombre existente.

Una exclusión mutua local solo existe dentro del proceso. La puede usar cualquier subproceso del proceso que tenga una referencia al objeto Mutex local. Cada objeto Mutex es una exclusión mutua local independiente.

Seguridad de control de acceso para exclusiones mutuas del sistema

.NET Framework proporciona la capacidad de consultar y establecer la seguridad de control de acceso de Windows para los objetos del sistema con nombre. Se recomienda proteger las exclusiones mutuas del sistema desde el momento en que se crean, porque los objetos de sistema son globales y, por lo tanto, puede bloquearlos un código distinto del suyo.

Para obtener información sobre la seguridad de control de acceso para las exclusiones mutuas, vea las clases MutexSecurity y MutexAccessRule, la enumeración MutexRights, los métodos GetAccessControl, SetAccessControl y OpenExisting de la clase Mutex y el constructor Mutex(Boolean, String, Boolean, MutexSecurity).

Nota

La seguridad del control de acceso para las exclusiones mutuas del sistema solo está disponible con .NET Framework, y no con .NET Core o .NET 5 y versiones posteriores.

Vea también