Exclusiones mutuas (mutex)

Actualización: noviembre 2007

Puede utilizar un objeto Mutex para proporcionar acceso exclusivo a un recurso. La clase Mutex utiliza más recursos del sistema que la clase Monitor, pero pueden calcularse referencias de la misma a través de los límites del dominio de aplicación, puede utilizarse con varias esperas y puede utilizarse para sincronizar subprocesos de distintos procesos. Encontrará una comparación de los mecanismos de sincronización administrados en Información general sobre los primitivos de sincronización.

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

Usar exclusiones mutuas

Un subproceso llama al método WaitOne de una exclusión mutua para solicitar su propiedad. La llamada se bloquea hasta que la exclusión mutua queda disponible o hasta que transcurre el intervalo de tiempo de espera opcional. Si una exclusión mutua no pertenece a ningún subproceso, el estado de la misma se señaliza.

Un subproceso libera una exclusión mutua llamando a su método ReleaseMutex. Las exclusiones mutuas cuentan con afinidad de subproceso; es decir, el subproceso que posee la exclusión mutua es el único que puede liberarla. Si un subproceso libera una exclusión mutua que no posee, se produce una excepción ApplicationException en el subproceso.

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

Si un subproceso posee un objeto Mutex, dicho subproceso puede especificar el mismo Mutex en llamadas repetidas de solicitud de espera sin bloquear su ejecución; no obstante, deberá liberar Mutex las veces que sean necesarias para liberar su propiedad.

Exclusiones mutuas abandonadas

Si un subproceso finaliza sin liberar Mutex, la exclusión mutua se considera abandonada. Esto normalmente pone de manifiesto un error de programación grave porque el recurso al que protege la exclusión mutua podría quedarse en un estado incoherente. En la versión 2.0 de .NET Framework, se produce una excepción AbandonedMutexException en el siguiente subproceso que adquiere la exclusión mutua.

Nota:

En las versiones 1.0 y 1.1 de .NET Framework, un objeto Mutex abandonado se establece en estado señalado y el siguiente subproceso en espera obtiene su propiedad. Si no hay ningún subproceso en espera, Mutex permanece en estado señalado. No se produce ninguna excepción.

En el caso de una exclusión mutua en todo el sistema, una exclusión mutua abandonada podría indicar que una aplicación ha finalizado de forma abrupta (por ejemplo, mediante el Administrador de tareas de Windows).

Exclusiones mutuas locales y del sistema

Las exclusiones mutuas son de dos tipos: exclusiones mutuas locales y exclusiones mutuas del sistema con nombre. Si crea un objeto Mutex mediante el uso de un constructor que acepta un nombre, quedará asociado a un objeto del sistema operativo con ese nombre. Las exclusiones mutuas del sistema con nombre son visibles en todo el sistema operativo y pueden utilizarse 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 utilizar el método OpenExisting para abrir una exclusión mutua del sistema con nombre existente.

Una exclusión mutua local sólo existe dentro de su proceso. Puede utilizarla 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

La versión 2.0 de .NET Framework proporciona la posibilidad de consultar y establecer seguridad de control de acceso de Windows para los objetos del sistema con nombre. Es recomendable proteger las exclusiones mutuas del sistema desde el momento de su creación porque los objetos del sistema son globales y, por lo tanto, un código distinto del suyo propio es capaz de bloquearlas.

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).

Vea también

Conceptos

Monitores

Subprocesos y subprocesamiento

Referencia

Mutex

Mutex

MutexSecurity

MutexAccessRule

Otros recursos

Subprocesamiento administrado

Objetos y características de subprocesos