synlock lock example ejemplo async c# multithreading synchronization

c# - example - ¿Cuál es la diferencia entre Lock y Mutex?



synclock c# example (6)

¿Cuál es la diferencia entre Lock y Mutex? ¿Por qué no pueden usarse indistintamente?


Mutex es un proceso cruzado y habrá un ejemplo clásico de no ejecutar más de una instancia de una aplicación.

El segundo ejemplo es decir que tienes un archivo y no quieres que un proceso diferente acceda al mismo archivo, puedes implementar un Mutex pero recuerda una cosa: Mutex es un sistema operativo de ancho y no se puede usar entre dos procesos remotos.

El bloqueo es la forma más sencilla de proteger la sección de su código y es específico del dominio de la aplicación, puede reemplazar el bloqueo con Monitors si desea una sincronización más controlada.


Un lock es específico para AppDomain, mientras que Mutex para el sistema operativo le permite realizar sincronización y bloqueo entre procesos (IPC).


Un Mutex puede ser local para un proceso o para todo el sistema . Mutex :

Los mutexes son de dos tipos: mutexes locales, que no tienen nombre, y mutexes del sistema con nombre. Un mutex local existe solo dentro de su proceso.

Además, se debe tener especial cuidado, detallado en la misma página también, cuando se utiliza un mutex en todo el sistema en un sistema con Servicios de Terminal Server.

Una de las diferencias entre Mutex y lock es que Mutex utiliza una construcción de nivel de kernel , por lo que la sincronización siempre requerirá al menos una transición de espacio de kernel de espacio de usuario.

lock - eso es realmente un acceso directo a la lock , por otro lado trata de evitar la asignación de recursos del kernel y la transición al código kernel (y por lo tanto es más ágil y rápido). Si uno tiene que encontrar un constructo WinAPI que se asemeje, sería CriticalSection ).

La otra diferencia es lo que otros señalan: un Mutex nombre se puede usar en todos los procesos.

A menos que uno tenga necesidades especiales o requiera sincronización en todos los procesos, simplemente es mejor lock (también conocido como Monitor ) ˛

Hay muchas otras diferencias "menores", como cómo se maneja el abandono, etc.

Lo mismo puede decirse de ReaderWriterLock y ReaderWriterLockSlim en 3.5, Semaphore y el nuevo SemaphoreSlim en .NET 4.0, etc. Es cierto que las últimas clases xxSlim no se pueden utilizar como primitivas de sincronización en todo el sistema, pero nunca tuvieron la intención de hacerlo. fueron "solo" para ser más rápidos y más amigables con los recursos.


Uso un Mutex para verificar si ya tengo una copia de la aplicación ejecutándose en la misma máquina.

bool firstInstance; Mutex mutex = new Mutex(false, @"Local/DASHBOARD_MAIN_APPLICATION", out firstInstance); if (!firstInstance) { //another copy of this application running } else { //run main application loop here. } // Refer to the mutex down here so garbage collection doesn''t chuck it out. GC.KeepAlive(mutex);


Ya se ha dicho mucho, pero para hacerlo simple, aquí está mi opinión.

lock -> Simple de usar, wrapper en el monitor, se bloquea entre subprocesos en un AppDomain.

mutex sin nombre -> similar al bloqueo, excepto que el alcance de bloqueo es mayor y se extiende a través del dominio de la aplicación en un proceso.

El ámbito de exclusión mutex -> con nombre es mucho más que el mutex sin nombre y está en proceso en un sistema operativo.

Entonces, ahora que las opciones están ahí, debe elegir la que mejor se adapte a su caso.


lock es una palabra clave del compilador, no una clase u objeto real. Es una envoltura alrededor de la funcionalidad de la clase Monitor y está diseñada para hacer que el Monitor sea ​​más fácil de usar para el caso común.

El Monitor (y la palabra clave de lock ) están, como dijo Darin, restringidos a AppDomain . Principalmente porque se requiere una referencia a una dirección de memoria (en forma de un objeto instanciado) para administrar el "bloqueo" y mantener la identidad del Monitor

El Mutex , por otro lado, es un contenedor .Net alrededor de una construcción de sistema operativo, y se puede usar para la sincronización de todo el sistema, usando datos de cadena (en lugar de un puntero a datos) como su identificador. Dos mutexes que hacen referencia a dos cadenas en dos direcciones de memoria completamente diferentes, pero que tienen los mismos datos , utilizarán realmente el mismo mutex del sistema operativo.