2010-09-17 15 views

Respuesta

111

A lock es específico para el dominio de la aplicación, mientras que Mutex para el sistema operativo, lo que le permite realizar sincronizaciones y bloqueos entre procesos.

6

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 tiene un archivo y no desea que un proceso diferente acceda al mismo archivo, puede implementar un Mutex pero recuerde que Mutex es un sistema operativo de ancho y no puede utilizarse 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.

74

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

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

El Mutex, por otro lado, es un contenedor .Net alrededor una construcción de sistema operativo, y se puede utilizar para la sincronización de todo el sistema, utilizando la cadena datos (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 en realidad el mismo mutex del sistema operativo.

18

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); 
44

A Mutex puede ser sea local a un proceso o de todo el sistema. MSDN:

mutex son de dos tipos: exclusiones mutuas locales, que son sin nombre, y exclusiones mutuas 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 - al usar 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 kernel-level construct, por lo que la sincronización siempre requerirá al menos una transición usuario espacio espacio-kernel.

lock - que es realmente un acceso directo a la Monitor class, por el contrario trata de evitar la asignación de recursos del núcleo y la transición al núcleo del código (y por tanto es más delgado & más rápido - si uno tiene que encontrar un WinAPI construcción que se asemeja, sería CriticalSection).

La otra diferencia es lo que otros señalan: un nombradoMutexpuede usarse través de procesos.

menos que uno tenga necesidades especiales o requiere sincronización a través de los procesos, es simplemente mejor atenerse a lock (también conocido como Monitor) ˛

Hay varias 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 este último xxSlim clases no se pueden utilizar como un todo el sistema primitivas de sincronización, pero nunca se destinado a - ellos fueron "solo" destinados a b e más rápido y más amigable con los recursos.

3

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

cerradura -> Fácil de usar, envoltorio en el monitor, bloquea entre subprocesos en un Dominio de aplicación.

mutex sin nombre -> similar a la cerradura, salvo que el alcance de bloqueo es más y está en AppDomain en un proceso.

Natex mutex -> alcance de bloqueo es mucho más que mutex sin nombre y está en proceso en un sistema operativo.

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

+0

Como he entendido por las respuestas y los ejemplos para mutex aquí https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx: un mutex sin nombre actúa como un candado. Sin embargo mutex.WaitOne (1000) nos da la oportunidad de esperar el bloqueo. Por otro lado, Monitor.TryEnter también nos da esa habilidad. Como se mencionó, Mutex es un envoltorio. Entonces usaría un bloqueo o monitor en lugar de un mutex sin nombre. Pero si se requiere un bloqueo en los procesos, un mutex con nombre es el camino a seguir. Por favor, corríjame si estoy equivocado. – Koray

Cuestiones relacionadas