Trådrelaterade koncept 1. Trådsynkronisering ManualResetEvent Set()-metoden sätter tillståndet till Signaled Reset() för att ställa in signalen utan signal WaitOne() kommer att blockera tills den har en signal, och om det finns en signal vid tidpunkten för att ringa WaitOne kommer den inte att blockera AutoResetEvent Skillnaden från ManualResetEvent är att AutoResetEvent.WaitOne() automatiskt ändrar tillståndet för händelseobjektet, det vill säga att tillståndet för händelsen ändras varje gång AutoResetEvent.WaitOne() körs. Signal – > ingen signal; Ingen signal – > har en signal
example:
myResetEven.Set(), som faktiskt är ekvivalent med en switch, om metoden set() inte körs, kommer följande waitOne() inte att kunna vänta på notifikationen för att låta den köras, så att satsen efter waitOne inte kommer att exekvera. Monitormetoden Wait() Pulse()-mekanismen används för intertrådsinteraktion, när ett objekt skickar ut Monitor.Wait(), kommer tråden som använder objektet att förbli i väntande tillstånd. tills den får en väckningssignal. Monitor.Pulse() används för att skicka signaler till den väntande tråden. Det vill säga, i det kritiska området mellan Monitor.Enter() och Monitor.Exit(), för att släppa låset på objektet och blockera den aktuella tråden, befinner det sig i ett väntande tillstånd i kön.
Lock skiljer sig från Mutex Låssynkronisering mellan flera trådar Synkronisering av flera trådar mellan Mutex-processer, eller synkronisering av flera processer I .Net multitrådad programmering används ofta klasserna AutoResetEvent och ManualResetEvent, och deras användning är mycket lik, men det finns skillnader. Set-metoden sätter signalen i sändningstillståndet, Reset-metoden sätter signalen i icke-sändningstillståndet, och WaitOne väntar på att signalen ska skickas. Konstruktörens initiala tillstånd kan bestämmas av parametervärdet, om det är sant är det inte blockerande, och falskt är blockeringstillståndet. Om en tråd anropar WaitOne-metoden får tråden signalen när den är i sändningstillståndet och fortsätter att köras nedåt. Skillnaden är att efter anropet tillåter AutoResetEvent.WaitOne() bara en tråd att komma in åt gången, och när en tråd får en signal kommer AutoResetEvent automatiskt att sätta signalen till inget sändningstillstånd, och de andra trådarna som anropar WaitOne kan bara fortsätta vänta. Det vill säga, AutoResetEvent väcker bara en tråd åt gången; ManualResetEvent kan väcka flera trådar, eftersom när en tråd anropar ManualResetEvent.Set()-metoden, får de andra trådarna som anropar WaitOne signalen att fortsätta körningen, och ManualResetEvent ställer inte automatiskt in signalen att inte skickas. Med andra ord, om inte ManualResetEvent.Reset()-metoden anropas manuellt, kommer ManualResetEvent att förbli signalerad och ManualResetEvent kan väcka flera trådar samtidigt för att fortsätta körningen. |