2008-09-05 8 views
9

Je suis dans une situation où plusieurs instances d'un programme peuvent s'exécuter simultanément, et il est important qu'une seule fonction spécifique ne s'exécute pas dans plusieurs de ces instances à la fois. Est-ce la bonne façon d'utiliser un mutex pour éviter que cela se produise?Est-ce la bonne utilisation d'un mutex?

lock (this.GetType()) { 
    _log.Info("Doing Sync"); 
    DoSync(); 
    _log.Info("Sync Completed"); 
} 

Répondre

18

Vous avez dit plusieurs instances d'une application, nous parlons donc du fonctionnement de deux programmes, n'est-ce pas? L'instruction lock ne se verrouille pas sur plusieurs programmes, juste au sein du programme. Si vous voulez un vrai Mutex, regardez l'objet System.Threading.Mutex.

Voici un exemple d'utilisation:

bool createdNew; 
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew)) 
{ 
    try 
    { 
     mtx.WaitOne(); 

     MessageBox.Show("Click OK to release the mutex."); 
    } 
    finally 
    { 
     mtx.ReleaseMutex(); 
    } 
} 

La variable createdNew vous permettra de savoir si oui ou non il a été créé la première fois. Il vous dit seulement s'il a été créé, cependant. Si vous souhaitez acquérir le verrou, vous devez appeler WaitOne, puis appeler ReleaseMutex pour le libérer. Si vous voulez juste voir si vous avez créé un Mutex, il suffit de le construire.

5

Le lecteur est correct.

Le conseil de Jeff Richter dans Clr Via C# (p638-9) sur le verrouillage est de créer un objet privé spécifiquement dans le but d'être verrouillé.

private Object _lock = new Object(); 

// usage 
lock(_lock) 
{ 
    // thread-safe code here.. 
} 

Cela fonctionne parce que _lock ne peut pas être bloqué par quoi que ce soit en dehors de la classe actuelle.

EDIT: ceci s'applique aux threads s'exécutant dans un processus unique. La réponse de @David Mohundro est correcte pour le verrouillage inter-processus.