Objetos de exclusión mutua

Un objeto de exclusión mutua es un objeto de sincronización cuyo estado se establece en señalado cuando no es propiedad de ningún subproceso y no asignado cuando es propiedad de él. Solo un subproceso a la vez puede poseer un objeto de exclusión mutua, cuyo nombre procede del hecho de que resulta útil coordinar el acceso mutuamente exclusivo a un recurso compartido. Por ejemplo, para evitar que dos subprocesos escriban en memoria compartida al mismo tiempo, cada subproceso espera la propiedad de un objeto de exclusión mutua antes de ejecutar el código que accede a la memoria. Después de escribir en la memoria compartida, el subproceso libera el objeto de exclusión mutua.

Un subproceso usa la función CreateMutex o CreateMutexEx para crear un objeto de exclusión mutua. El subproceso de creación puede solicitar la propiedad inmediata del objeto de exclusión mutua y también puede especificar un nombre para el objeto de exclusión mutua. También puede crear una exclusión mutua sin nombre. Para obtener información adicional sobre los nombres de los objetos mutex, event, semaphore y timer, vea Interprocess Synchronization.

Los subprocesos de otros procesos pueden abrir un identificador para un objeto de exclusión mutua con nombre existente especificando su nombre en una llamada a la función OpenMutex . Para pasar un identificador a una exclusión mutua sin nombre a otro proceso, use la función DuplicateHandle o la herencia del identificador primario-secundario.

Cualquier subproceso con un identificador para un objeto de exclusión mutua puede usar una de las funciones de espera para solicitar la propiedad del objeto de exclusión mutua. Si el objeto de exclusión mutua es propiedad de otro subproceso, la función wait bloquea el subproceso solicitante hasta que el subproceso propietario libera el objeto de exclusión mutua mediante la función ReleaseMutex . El valor devuelto de la función wait indica si la función devuelta por algún motivo distinto del estado de la exclusión mutua que se establece en señalizado.

Si hay más de un subproceso en espera en una exclusión mutua, se selecciona un subproceso en espera. No asuma un orden primero en salir (FIFO). Los eventos externos, como las API en modo kernel, pueden cambiar el orden de espera.

Después de que un subproceso obtenga la propiedad de una exclusión mutua, puede especificar la misma exclusión mutua en llamadas repetidas a las funciones de espera sin bloquear su ejecución. Esto evita que un subproceso se interbloquee mientras espera una exclusión mutua que ya posee. Para liberar su propiedad en tales circunstancias, el subproceso debe llamar a ReleaseMutex una vez por cada vez que la exclusión mutua cumpla las condiciones de una función de espera.

Si un subproceso finaliza sin liberar su propiedad de un objeto de exclusión mutua, el objeto de exclusión mutua se considera abandonado. Un subproceso en espera puede adquirir la propiedad de un objeto de exclusión mutua abandonada, pero la función wait devolverá WAIT_ABANDONED para indicar que se abandona el objeto de exclusión mutua. Un objeto de exclusión mutua abandonada indica que se ha producido un error y que cualquier recurso compartido que está protegido por el objeto de exclusión mutua está en un estado indefinido. Si el subproceso continúa como si el objeto de exclusión mutua no se hubiera abandonado, ya no se considera abandonado después de que el subproceso libere su propiedad. Esto restaura el comportamiento normal si un identificador del objeto de exclusión mutua se especifica posteriormente en una función de espera.

Tenga en cuenta que los objetos de sección críticos proporcionan una sincronización similar a la proporcionada por objetos de exclusión mutua, excepto que los objetos de sección críticos solo los pueden usar los subprocesos de un único proceso.

Uso de objetos de exclusión mutua