web-dev-qa-db-fra.com

Utilisation de Mutex en c #

Je suis un peu nouveau en enfilant dans c # et en général, Dans mon programme, j'utilise mutex pour permettre à un seul fil de pénétrer dans une section critique et pour une raison inconnue de faire des copies cw, je peux voir plus d'un fil entre dans ma section critique et voici mon code: 

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

J'aimerais beaucoup savoir si je fais une erreur ici, merci d'avance pour votre aimable aide.

MODIFIER:  

Mon code inclut des classes, il ressemble donc plus à ceci:

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


    } 
29
Nadav Stern

Le problème ici est que tous vos appelants utilisent un différent mutex; vous avez besoin que l'objet de verrouillage soit partagé, généralement en en faisant un champ Par exemple, pour passer à une métaphore lock plus simple:

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

ou en utilisant le mutex:

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

Ce modèle ne verrouille pas du tout. Chaque thread crée un nouvel objet Mutex et possède immédiatement le verrou correspondant. D'autres threads créent et utilisent un nouveau mutex lui-même.

Pensez à utiliser un verrou classique ()! 

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

où _lockobject est une simple variable privée dans votre classe: 

private object _lockobject; 

Edit: merci aux commentateurs! Il existe des situations où le verrouillage peut être dangereux. Alors j'ai enlevé ça. 

5
user492238

On dirait que vous donnez à chaque fil son propre mutex. Ça ne marchera pas. 

Et un mutex est exagéré dans la plupart des situations. Tu a juste besoins:

private static object syncLock = new object();  // just 1 instance

....

lock(syncLock)
{
    // critical section
}
5
Henk Holterman

Mutex utilisé pour identifier une instance d'application en cours d'exécution. 

 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!");
                }
            }
1
Lakiya