Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Puede usar un Mutex objeto para proporcionar acceso exclusivo a un recurso. La clase Mutex usa más recursos del sistema que la clase Monitor, pero puede movilizarse a través de los límites del dominio de aplicación, puede utilizarse con múltiples esperas, y puede emplearse para sincronizar hilos en diferentes procesos. Para obtener una comparación de los mecanismos de sincronización administrados, consulte Introducción a los primitivos de sincronización.
Para obtener ejemplos de código, consulte la documentación de referencia de los Mutex constructores.
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 posee un Mutex, ese subproceso puede especificar el mismo Mutex en llamadas repetidas de solicitud de espera sin bloquear su ejecución; sin embargo, debe liberar el Mutex tantas veces como sea necesario 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 Mutex objeto mediante un constructor que acepta un nombre, está asociado a un objeto de sistema operativo de 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. Puede ser utilizado por cualquier subproceso del proceso que tenga una referencia al objeto local Mutex . Cada Mutex objeto es un mutex local separado.
Seguridad de control de acceso para exclusiones mutuas del sistema
.NET Framework proporciona la capacidad de consultar y establecer la seguridad del control de acceso de Windows para los objetos del sistema nombrados. 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.