thread method locker lock ejemplo c# multithreading mutex

method - Uso de Mutex en c#



mutex c++ (4)

El problema aquí es que todas las personas que llaman están utilizando un mutex diferente ; necesita que el objeto de bloqueo se comparta , usualmente haciéndolo un campo. Por ejemplo, y cambiando a una metáfora de lock más simple:

private readonly object syncLock = new object(); public void ThreadSafeMethod() { lock(syncLock) { /* critical code */ } }

o utilizando el mutex:

private readonly Mutex m = new Mutex(); public void ThreadSafeMethod() { m.WaitOne(); try { /* critical code */ } finally { m.ReleaseMutex(); } }

Soy un poco nuevo en subprocesos en c # y en general, en mi programa estoy usando el mutex para permitir que solo 1 subproceso ingrese a una sección crítica y, por una razón desconocida, al hacer algunas copias de cw, puedo ver que más de 1 subproceso está entrando Mi sección crítica y este es mi código:

Mutex m = new Mutex(); m.WaitOne(); <C.S> // critical section here m.ReleaseMutex();

Me gustaría mucho saber si estoy cometiendo un error aquí, gracias de antemano por su amable ayuda.

EDITAR:

Mi código incluye clases, así que básicamente se parece más a esto:

public class test { private mutex m; public test() { m = new mutex(); } public func() { m.WaitOne(); <C.S> // critical section here m.ReleaseMutex(); } }


Este patrón no hace ningún bloqueo en absoluto. Cada hilo crea un nuevo objeto Mutex e inmediatamente posee el bloqueo para él. Otros hilos crean y utilizan un nuevo Mutex.

Considere el uso de un bloqueo regular ()!

lock(_lockobject) { // do inside what needs to be done - executed on a single thread only }

donde _lockobject es una variable privada simple en tu clase:

private object _lockobject;

Edit: gracias a los comentaristas! Existen situaciones donde el bloqueo (esto) puede ser peligroso. Así que quité eso.


Mutex utiliza para identificar la instancia de la aplicación de ejecución.

using (Mutex mutex = new Mutex(true, "app name", out createdNew)) { if (createdNew)//check app is already run { KillOthers(); StartApp(); } else { MessageBox.Show("Another instance already running!"); } }


Parece que le das a cada hilo su propio Mutex. Eso no funcionará.

Y un Mutex es una exageración en la mayoría de las situaciones. Solo necesitas:

private static object syncLock = new object(); // just 1 instance .... lock(syncLock) { // critical section }