Threadbezogene Konzepte 1. Thread-Synchronisation ManualResetEvent Die Set()-Methode setzt den Zustand auf Signaled Reset(), um es auf kein Signal zu stellen WaitOne() blockiert, bis es ein Signal hat, und wenn zum Zeitpunkt des Anrufs von WaitOne ein Signal vorhanden ist, blockiert es nicht AutoResetEvent Der Unterschied zu ManualResetEvent besteht darin, dass AutoResetEvent.WaitOne() automatisch den Zustand des Ereignisobjekts ändert, das heißt, der Zustand des Ereignisses ändert sich jedes Mal, wenn AutoResetEvent.WaitOne() ausgeführt wird. Signal – > kein Signal; Kein Signal – > hat ein Signal
example:
myResetEven.Set(), was tatsächlich äquivalent zu einem Switch ist, kann die folgende waitOne() nicht auf die Benachrichtigung warten, sodass die Anweisung nach waitOne nicht ausgeführt wird, sodass die Anweisung nach waitOne nicht ausgeführt wird. Überwachungsmethode Der Wait() Pulse()-Mechanismus wird für die Interthread-Interaktion verwendet; wenn ein Objekt Monitor.Wait() aussendet, bleibt der Thread, der auf das Objekt zuruft, im Wartezustand. Bis es ein Aufwachsignal bekommt. Monitor.Pulse() wird verwendet, um Signale an den wartenden Thread zu senden. Das heißt, im kritischen Bereich zwischen Monitor.Enter() und Monitor.Exit(), um die Sperre des Objekts zu lösen und den aktuellen Thread zu blockieren, befindet es sich in einem Wartezustand in der Warteschlange.
Lock unterscheidet sich von Mutex Lock-Synchronisation zwischen mehreren Threads Synchronisation mehrerer Threads zwischen Mutex-Prozessen oder Synchronisation mehrerer Prozesse In der .Net-Multithreaded-Programmierung werden häufig die Klassen AutoResetEvent und ManualResetEvent verwendet, deren Verwendung sehr ähnlich ist, aber es gibt Unterschiede. Die Set-Methode versetzt das Signal in den Sendezustand, die Reset-Methode versetzt das Signal in den Nicht-Senden-Zustand, und WaitOne wartet darauf, dass das Signal gesendet wird. Der Anfangszustand des Konstruktors kann durch den Parameterwert bestimmt werden: Wenn er wahr ist, blockiert er nicht, und falsch ist der blockierende Zustand. Wenn ein Thread die WaitOne-Methode aufruft, erhält er das Signal, wenn er sich im Sendezustand befindet, und führt weiter nach unten aus. Der Unterschied besteht darin, dass nach dem Aufruf AutoResetEvent.WaitOne() nur einen Thread gleichzeitig eintreten lässt, und wenn ein Thread ein Signal erhält, stellt AutoResetEvent das Signal automatisch auf keinen Senden-Zustand, während die anderen Threads, die WaitOne aufrufen, nur weiter warten können. Das heißt, AutoResetEvent weckt jeweils nur einen Thread auf; ManualResetEvent kann mehrere Threads aufwecken, weil wenn ein Thread die ManualResetEvent.Set()-Methode aufruft, die anderen Threads, die WaitOne aufrufen, das Signal zur Fortsetzung der Ausführung erhalten, und ManualResetEvent das Signal nicht automatisch so einstellt, dass es nicht gesendet wird. Mit anderen Worten: Wenn die ManualResetEvent.Reset()-Methode nicht manuell aufgerufen wird, bleibt das ManualResetEvent signalisiert und das ManualResetEvent kann mehrere Threads gleichzeitig aufwecken, um die Ausführung fortzusetzen. |