Koncepty související s vlákny 1. Synchronizace vláken ManuálníResetUdálost Metoda Set() nastavuje stav na Signalizovaný Reset() nastav na žádný signál WaitOne() bude blokovat, dokud nebude mít signál, a pokud je signál v době volání WaitOne, nebude blokován AutoResetEvent Rozdíl oproti ManualResetEvent je v tom, že AutoResetEvent.WaitOne() automaticky mění stav objektu události, tedy stav události se mění pokaždé, když je AutoResetEvent.WaitOne() vykonán. Signál - > žádný signál; Žádný signál – > má signál
example:
myResetEven.Set(), což je ve skutečnosti ekvivalent switche, pokud metoda set() není vykonána, následující waitOne() nebude moci počkat na oznámení, aby ji umožnilo spustit, takže příkaz po waitOne nebude vykonán. Metoda monitorování Mechanismus Wait() Pulse() se používá pro interakci mezi vlákny; když objekt vysílá Monitor.Wait(), vlákno, které k objektu přistupuje, zůstane ve stavu čekaní. dokud nedostane signál k probuzení. Monitor.Pulse() se používá k posílání signálů do čekajícího vlákna. To znamená, že v kritické oblasti mezi Monitor.Enter() a Monitor.Exit(), aby se uvolnil zámek objektu a zablokovalo aktuální vlákno, je ve frontě v čekací fázi.
Lock je jiný než Mutex Synchronizace zámku mezi více vlákny Synchronizace více vláken mezi procesy Mutex nebo synchronizace více procesů V .Net vícevláknovém programování se často používají třídy AutoResetEvent a ManualResetEvent, jejichž použití je velmi podobné, ale existují rozdíly. Metoda Set přemístí signál do odesílacího stavu, metoda Reset ho přemístí do stavu neodesílání a WaitOne čeká, až bude signál odeslán. Počáteční stav konstruktoru lze určit hodnotou parametru, pokud je true, není blokující, a false je blokující stav. Pokud vlákno zavolá metodu WaitOne, vlákno dostane signál, když je ve stavu odesílání, a pokračuje v provádění směrem dolů. Rozdíl je v tom, že po volání AutoResetEvent.WaitOne() povoluje vstup pouze jednomu vláknu najednou, a když vlákno dostane signál, AutoResetEvent automaticky přeřadí signál do stavu bez odeslání, zatímco ostatní vlákna volající WaitOne mohou pouze pokračovat v čekání. To znamená, že AutoResetEvent probouzí pouze jedno vlákno najednou; ManualResetEvent může probudit více vláken, protože když jedno vlákno zavolá metodu ManualResetEvent.Set(), ostatní vlákna volající WaitOne dostanou signál k pokračování ve vykonání a ManualResetEvent automaticky nenastaví signál na neodesílání. Jinými slovy, pokud není metoda ManualResetEvent.Reset() vyvolána ručně, ManualResetEvent zůstane signalizován a ManualResetEvent může současně probudit více vláken pro pokračování v vykonání. |