Draadgerelateerde concepten 1. Thread-synchronisatie ManualResetEvent De Set()-methode zet de toestand op Signaled Reset() om het op geen signaal te zetten WaitOne() blokkeert totdat er een signaal is, en als er een signaal is op het moment dat WaitOne wordt geroepen, blokkeert het niet AutoResetEvent Het verschil met ManualResetEvent is dat AutoResetEvent.WaitOne() automatisch de status van het eventobject verandert, dat wil zeggen, de status van het event verandert elke keer dat AutoResetEvent.WaitOne() wordt uitgevoerd. Signaal - > geen signaal; Geen signaal – > een signaal heeft
example:
myResetEven.Set(), wat eigenlijk equivalent is aan een switch, als de set()-methode niet wordt uitgevoerd, kan de volgende waitOne() niet wachten op de melding om het te laten uitvoeren, zodat de instructie na waitOne niet wordt uitgevoerd. Monitormethode Het Wait() Pulse()-mechanisme wordt gebruikt voor interthreadinteractie; wanneer een object Monitor.Wait() uitzendt, blijft de thread die het object benadert in de wachttoestand. totdat hij een weksignaal krijgt. Monitor.Pulse() wordt gebruikt om signalen naar de wachtende thread te sturen. Dat wil zeggen, in het kritieke gebied tussen Monitor.Enter() en Monitor.Exit(), om de lock op het object te ontgrendelen en de huidige thread te blokkeren, bevindt het zich in een wachtende toestand in de wachtrij.
Lock is anders dan Mutex Lock-synchronisatie tussen meerdere threads Synchronisatie van meerdere threads tussen Mutex-processen, of synchronisatie van meerdere processen In .Net multithreaded programmeren worden vaak de AutoResetEvent- en ManualResetEvent-klassen gebruikt, en hun gebruik is erg vergelijkbaar, maar er zijn verschillen. De Set-methode zet het signaal in de zendtoestand, de Reset-methode zet het signaal in de niet-verzendtoestand, en WaitOne wacht tot het signaal wordt verzonden. De begintoestand van de constructor kan worden bepaald door de parameterwaarde; als deze waar is, blokkeert hij niet, en is de blokkerende toestand onwaar. Als een thread de WaitOne-methode aanroept, ontvangt de thread het signaal wanneer hij in de zendtoestand is en blijft deze naar beneden uitvoeren. Het verschil is dat na de aanroep AutoResetEvent.WaitOne() slechts één thread tegelijk toestaat, en wanneer een thread een signaal ontvangt, zet AutoResetEvent automatisch het signaal op geen verzendstatus, en de andere threads die WaitOne aanroepen kunnen alleen blijven wachten. Dat wil zeggen, AutoResetEvent wekt slechts één thread tegelijk; ManualResetEvent kan meerdere threads wakker maken, omdat wanneer één thread de ManualResetEvent.Set()-methode aanroept, de andere threads die WaitOne aanroepen het signaal krijgen om door te gaan, en ManualResetEvent het signaal niet automatisch op niet verzenden zet. Met andere woorden, tenzij de ManualResetEvent.Reset()-methode handmatig wordt aangeroepen, blijft de ManualResetEvent gesignaleerd en kan de ManualResetEvent meerdere threads tegelijk wakker maken om de uitvoering voort te zetten. |