Cuando dos o más subprocesos tienen que obtener acceso a un recurso compartido al mismo tiempo, el sistema necesita un mecanismo de sincronización para garantizar que sólo uno de los subprocesos utilice el recurso en ese momento. Mutex es un primitivo de sincronización que otorga acceso exclusivo al recurso compartido a un solo subproceso. Cuando un subproceso adquiere una exclusión mutua (mutex), el siguiente subproceso que intenta adquirir dicha exclusión mutua se suspende hasta que el primer subproceso libera la exclusión mutua.
Para solicitar la propiedad de una exclusión mutua puede utilizar el método WaitHandle.WaitOne. El subproceso que posee una exclusión mutua puede solicitar la misma exclusión mutua en llamadas repetidas a WaitOne sin bloquear su ejecución. Sin embargo, el subproceso debe llamar al método ReleaseMutex el mismo número de veces para liberar la propiedad de la exclusión mutua. La clase Mutex exige la identidad del subproceso, por lo que sólo podrá liberar la exclusión mutua el subproceso que la adquirió. Por el contrario, la clase Semaphore no exige la identidad del subproceso.
Si un subproceso finaliza mientras posee una exclusión mutua, se dice que la exclusión mutua está abandonada. El estado de la exclusión mutua se establece en señalado y el siguiente subproceso en espera obtiene la propiedad de la exclusión. Si no hay ningún propietario de la exclusión mutua, el estado de la exclusión mutua está señalado. A partir de la versión 2.0 de .NET Framework, se produce una excepción AbandonedMutexException en el siguiente subproceso que adquiere la exclusión mutua. En las versiones de .NET Framework anteriores a la 2.0, no se producía ninguna excepción.
Precaución: |
|---|
| Una exclusión mutua abandonada indica un error grave en el código. Cuando un subproceso sale sin liberar la exclusión mutua, el estado de las estructuras de datos a las que protege la exclusión mutua podría ser inconstante. El siguiente subproceso que solicita la propiedad de la exclusión mutua puede controlar esta excepción y continuar si se puede comprobar la integridad de las estructuras de datos. |
Las exclusiones mutuas son de dos tipos: exclusiones mutuas locales y exclusiones mutuas del sistema con nombre. Si crea un objeto Mutex con un constructor que acepta un nombre, se asocia a un objeto del sistema operativo con dicho nombre. Las exclusiones mutuas del sistema con nombre son visibles en todo el sistema operativo y se pueden utilizar 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 ya existente.
Una exclusión mutua local sólo existe dentro del proceso del usuario. Puede utilizar la exclusión cualquier subproceso del proceso del usuario que tenga una referencia al objeto Mutex local. Cada objeto Mutex es una exclusión mutua local independiente.