Koncepti, povezani z nitmi 1. Sinhronizacija niti DogodekManualResetEvent Metoda Set() nastavi stanje na Signaled Reset() nastavite na brez signala WaitOne() blokira, dokler ne dobi signala, in če je signal ob klicu WaitOne, ga ne bo blokiral AutoResetEvent Razlika od ManualResetEvent je v tem, da AutoResetEvent.WaitOne() samodejno spremeni stanje objekta dogodka, torej se stanje dogodka spremeni vsakič, ko se izvede AutoResetEvent.WaitOne(). Signal - > brez signala; Brez signala – > ima signal
example:
myResetEven.Set(), ki je dejansko ekvivalenten stikalu, če metoda set() ni izvedena, naslednji waitOne() ne bo mogel počakati na obvestilo, da bi se izvedel, zato stavka po waitOne ne bo izveden. Metoda monitorja Mehanizem Wait() Pulse() se uporablja za interakcijo med nitmi, ko objekt oddaja Monitor.Wait(), nit, ki dostopa do objekta, ostane v stanju čakanja. dokler ne dobi signala za prebujanje. Monitor.Pulse() se uporablja za pošiljanje signalov v čakajočo nit. To pomeni, da je v kritičnem območju med Monitor.Enter() in Monitor.Exit(), da se sprosti zaklep na objektu in blokira trenutna nit, ta v čakalnem stanju v vrsti.
Lock je drugačen od Mutexa Sinhronizacija zaklepanja med več nitmi Sinhronizacija več niti med Mutex procesi ali sinhronizacija več procesov V .Net večnitnem programiranju se pogosto uporabljata razreda AutoResetEvent in ManualResetEvent, njuna uporaba je zelo podobna, vendar obstajajo razlike. Metoda Set prenese signal v stanje pošiljanja, metoda Reset signal v stanje brez pošiljanja, WaitOne pa počaka, da se signal pošlje. Začetno stanje konstruktorja lahko določimo z vrednostjo parametra, če je resnično, ne blokira, in false je blokirajoče stanje. Če nit kliče metodo WaitOne, nit prejme signal, ko je v stanju pošiljanja, in nadaljuje z izvajanjem navzdol. Razlika je v tem, da po klicu AutoResetEvent.WaitOne() dovoli vstop le eni niti naenkrat, in ko nit prejme signal, AutoResetEvent samodejno preusmeri signal v stanje brez pošiljanja, druge niti, ki kličejo WaitOne, pa lahko le še naprej čakajo. To pomeni, da AutoResetEvent prebudi le eno nit naenkrat; ManualResetEvent lahko prebudi več niti, ker ko ena nit pokliče metodo ManualResetEvent.Set(), druge niti, ki kličejo WaitOne, dobijo signal za nadaljevanje izvajanja, ManualResetEvent pa samodejno ne nastavi signala, da se ne pošlje. Z drugimi besedami, razen če metoda ManualResetEvent.Reset() ni poklicana ročno, bo ManualResetEvent ostal signaliziran in ManualResetEvent lahko hkrati prebudi več niti za nadaljevanje izvajanja. |