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
}