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 excluyente 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 tiene acceso 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 objetos mutex, event, semaphore y timer, vea Sincronización de interproceso.
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 de identificadores primarios y secundarios.
Cualquier subproceso con un identificador para un objeto de exclusión mutua puede usar una de las funciones de espera de 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ónReleaseMutex de. 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 esperando 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 de sin bloquear su ejecución. Esto impide 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 protegido por el objeto de exclusión mutua está en un estado indefinido. Si el subproceso continúa como si no se hubiera abandonado el objeto de exclusión mutua, ya no se considera abandonado después de que el subproceso libere su propiedad. Esto restaura el comportamiento normal si posteriormente se especifica un identificador en el objeto de exclusión mutua en una función de espera.
Tenga en cuenta que objetos de sección críticos proporcionar sincronización similar a la proporcionada por objetos de exclusión mutua, excepto que los subprocesos de un solo proceso pueden usar los objetos de sección críticos.
Temas relacionados