Koncepty súvisiace s vláknami 1. Synchronizácia vlákien Udalosť manuálneho resetovania Metóda Set() nastaví stav na Signalizované Reset() nastaviť na žiadny signál WaitOne() zablokuje, kým nemá signál, a ak je signál v čase volania WaitOne, neblokuje AutoResetEvent Rozdiel oproti ManualResetEvent je v tom, že AutoResetEvent.WaitOne() automaticky mení stav objektu udalosti, teda stav udalosti sa mení zakaždým, keď sa spustí AutoResetEvent.WaitOne(). Signál - > žiadny signál; Žiadny signál – > má signál
example:
myResetEven.Set(), čo je v skutočnosti ekvivalentné prepínačovi, ak sa metóda set() nevykoná, nasledujúci waitOne() nebude môcť počkať na notifikáciu, aby sa vykonal, takže príkaz po waitOne nebude vykonaný. Metóda monitorovania Mechanizmus Wait() Pulse() sa používa na interakciu medzi vláknami, keď objekt vysiela Monitor.Wait(), vlákno, ktoré k objektu pristupuje, zostane v čakacom stave. až kým nedostane signál na prebudenie. Monitor.Pulse() sa používa na odosielanie signálov do čakajúceho vlákna. To znamená, že v kritickej oblasti medzi Monitor.Enter() a Monitor.Exit(), aby sa uvoľnil zámok objektu a zablokovalo aktuálne vlákno, je v čakacom stave vo fronte.
Lock je iný ako Mutex Synchronizácia zámku medzi viacerými vláknami Synchronizácia viacerých vlákien medzi Mutex procesmi alebo synchronizácia viacerých procesov V .Net multithreaded programovaní sa často používajú triedy AutoResetEvent a ManualResetEvent, pričom ich použitie je veľmi podobné, ale existujú rozdiely. Metóda Set umiestni signál do odosielacieho stavu, metóda Reset ho presúva do stavu bez odoslania a WaitOne čaká na odoslanie signálu. Počiatočný stav konštruktora možno určiť hodnotou parametra, ak je true, nie je blokujúci a false je blokujúci stav. Ak vlákno zavolá metódu WaitOne, vlákno dostane signál, keď je v stave odosielania, a pokračuje v vykonávaní smerom nadol. Rozdiel je v tom, že po volaní AutoResetEvent.WaitOne() umožňuje vstup len jednému vláknu naraz, a keď vlákno dostane signál, AutoResetEvent automaticky preradí signál do stavu bez odoslania, zatiaľ čo ostatné vlákna volajúce WaitOne môžu len pokračovať v čakaní. To znamená, že AutoResetEvent prebúdza len jedno vlákno naraz; ManualResetEvent môže prebudiť viacero vlákien, pretože keď jedno vlákno volá metódu ManualResetEvent.Set(), ostatné vlákna volajúce WaitOne dostanú signál na pokračovanie vykonávania a ManualResetEvent automaticky nenastaví signál na neodoslanie. Inými slovami, pokiaľ metóda ManualResetEvent.Reset() nie je volaná manuálne, ManualResetEvent zostane signalizovaný a ManualResetEvent môže naraz prebudiť viacero vlákien na pokračovanie vykonávania. |