2016-04-29 10 views
3

Ich habe mehrere Möglichkeiten gefunden, 2 verschiedene Prozesse mit einem benannten Mutex oder anderen Sperren in .Net zu synchronisieren, aber ich habe nicht gefunden, wie es mit mehr als 2 Prozessen zu tun.Wie man 4 verschiedene Prozesse mit Mutex oder EventWaitHandler synchronisiert

Ich muss 4 verschiedene Prozesse synchronisieren Zugriff auf eine freigegebene Ressource. Ich habe versucht, mit:

 bool createdNew; 
     using (EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset, MutexName, out createdNew)) 
     { 
      if (!createdNew) 
      { 
       eventWaitHandle.WaitOne(); 
      } 

... Critical section 

      eventWaitHandle.Set(); 
     } 

Aber funktioniert nur mit 2 Prozessen, wenn der Griff alle Warte Prozesse zur gleichen Zeit beginnen gesetzt.

Irgendwelche Ideen?

+0

Was möchten Sie tun? – thebjorn

+0

Nur einer der 4 Prozesse kann zu einem bestimmten Zeitpunkt in den kritischen Bereich eindringen können. –

+0

Sie müssen einen Master-Prozess zuweisen, einen, der die Mutexe besitzt. Und kümmert sich um all die anderen kleinen Details, wie einer dieser Prozesse, der unerwartet beendet wird. Es ist sehr schwer sich davon zu erholen, also muss es auch alle anderen töten. –

Antwort

3

können Sie Mutex für die nach wie vor verwenden:

static void Main(string[] args) { 
    bool owned; 
    // first process will achieve ownership here, when creating 
    var mutex = new Mutex(true, "mymutex", out owned); 
    try { 
     if (!owned) { 
      // other processes will wait here, but only one will be released at a time 
      owned = mutex.WaitOne(); 
     } 
     Console.WriteLine($"Using the mutex on process {Process.GetCurrentProcess().Id}"); 
     Console.ReadLine(); 
    } 
    finally { 
     if (owned) 
      // if we own mutex - release to allow next processes to come in. 
      mutex.ReleaseMutex(); 
    } 
} 

Natürlich möchten Sie vielleicht, dass in praktisch IDisposable Klasse wickeln. Vergessen Sie nicht, das richtige Timeout unter WaitOne einzustellen.

+0

Sind Sie sicher? Mit dem EventWaitHandle werden alle wartenden Prozesse freigegeben, wenn das Event gesetzt wird. –

+0

Ja, ich habe den obigen Code mit 4 Prozessen getestet und sie gehen nacheinander in den kritischen Abschnitt über. Es ist wichtig, Mutex richtig zu verwenden (beachten Sie, wie die eigene Variable verwendet wird), um ein korrektes Ergebnis zu erzielen. – Evk