2015-08-22 4 views
5

Eines der Dinge, die ich in Multi-Thread-Programmierung schwer verstehen kann, ist die Tatsache, dass, wenn ein Thread eine Zeile erreicht, die WaitOne() aufruft, woher weiß ich, welche anderen Threads beteiligt sind? Wo oder wie finde ich (oder verstehe) wie das WaitHandle das Signal empfängt? Zum Beispiel, ich suche jetzt bei diesem Code:Wie finde ich die anderen Threads, die das Signal zurücksenden, wenn ein Thread WaitOne aufruft?

private void RunSync(object state, ElapsedEventArgs elapsedEventArgs) 
    { 
     _mutex.WaitOne(); 
     using (var sync = GWSSync.BuildSynchronizer(_log)) 
     { 
      try 
      { 
       sync.Syncronize(); 
      } 
      catch(Exception ex) 
      { 
       _log.Write(string.Format("Error during synchronization : {0}", ex)); 
      } 
     } 
     _mutex.ReleaseMutex(); 
     _syncTimer.Interval = TimeBeforeNextSync().TotalMilliseconds; 
     _syncTimer.Start(); 
    } 

ein paar Methoden, wie dies in der Datei Es gibt (das heißt RunThis(), RunThat()). Diese Methoden werden in einem Windows-Dienst ausgeführt und beim Ablauf eines Timers aufgerufen. Jede dieser Methoden sind mit unterschiedlichen Zeiten aufgerufen und eingerichtet wie folgt aus:

 //Synchro 
     var timeBeforeFirstSync = TimeBeforeNextSync(); 
     _syncTimer = new System.Timers.Timer(timeBeforeFirstSync.TotalMilliseconds); 
     _syncTimer.AutoReset = false; 
     _syncTimer.Elapsed += RunSync; 
     _syncTimer.Start(); 

Ich verstehe, dass, wenn der Timer abgelaufen ist, wird die RunSync Methode ausgeführt wird. Aber wenn es die WaitOne() Zeile trifft, wird der Thread blockiert. Aber auf wen wartet es? Welcher "andere" Thread sendet das Signal?

+5

Ich würde "Find Usages" auf der Mutex-Variable ausführen. – usr

+0

@usr Das würde nicht notwendig alle Verwendungen finden, wenn der Mutex benannt wird - aber ja, es ist ein Anfang. Aber mit dem, was wir tun müssen, ist es durchaus möglich, dass es ein (schlechter) Versuch ist, zwei gleichzeitige Ausführungen des Timer-Callbacks zu verhindern. Da es sich jedoch um einen Mutex handelt, ist es viel wahrscheinlicher, dass es mit einem anderen Prozess auf der Maschine synchronisiert wird - es sei denn, der ursprüngliche Autor kannte den Unterschied zwischen einem Monitor und einem Mutex nicht. – Luaan

+0

Nach dem Lesen von @usr-Kommentaren wurde mir klar, dass es andere Timer gibt, die andere Methoden starten, ähnlich wie oben. Ich habe meine Frage neu formuliert, um es besser zu erklären. – Ray

Antwort

1

WaitHandle ist eine Abstraktion, wie in der Dokumentation angegeben:

Fasst betriebssystemspezifische Objekte, die auf gemeinsame Ressourcen für den exklusiven Zugriff warten.

Sie wissen nicht, welche anderen Fäden beteiligt sind, aber Sie tun wissen, welche anderen Code durch Überprüfung der Verwendung des Griffs beteiligt ist (_mutex in Ihrem Fall). Jede WaitHandle abgeleitete Klasse erbt WaitOne, aber was nach erfolgreicher Wartezeit passiert und wie sie signalisiert wird, ist spezifisch. Zum Beispiel, in Ihrem Beispiel _mutex ist höchstwahrscheinlich eine Mutex Klasse, also WaitOne verhält sich wie "warten, bis es frei ist und Besitz übernehmen", während die ReleaseMutex wie "Freigabe Besitz und Signal" handelt. In diesem Sinne sollte es offensichtlich sein, was all diese Methoden tun - und sicherstellen, dass während RunThis Sie nicht RunThat und umgekehrt.

Verwandte Themen