Koncepcje związane z wątkami 1. Synchronizacja wątków ManualResetEvent Metoda Set() ustawia stan na Signaled Reset(), aby ustawić na brak sygnału WaitOne() zablokuje sygnał, a jeśli sygnał pojawi się w momencie wywołania WaitOne, nie zablokuje AutoResetEvent Różnica w stosunku do ManualResetEvent polega na tym, że AutoResetEvent.WaitOne() automatycznie zmienia stan obiektu zdarzenia, czyli stan zdarzenia zmienia się za każdym razem, gdy AutoResetEvent.WaitOne() zostanie wykonany. Sygnał - > brak sygnału; Brak sygnału – > ma sygnał
example:
myResetEven.Set(), który jest faktycznie równoważny przełącznikowi, jeśli metoda set() nie zostanie wykonana, następujący waitOne() nie będzie mógł poczekać na powiadomienie, aby umożliwić jej wykonanie, więc polecenie po waitOne nie zostanie wykonane. Metoda monitorowania Mechanizm Wait() Pulse() jest używany do interakcji między wątkami; gdy obiekt emituje Monitor.Wait(), wątek uzyskujący dostęp do obiektu pozostaje w stanie oczekiwania. aż dostanie sygnał pobudki. Monitor.Pulse() służy do wysyłania sygnałów do oczekującego wątku. To znaczy, w krytycznym obszarze pomiędzy Monitor.Enter() a Monitor.Exit(), aby zwolnić blokadę obiektu i zablokować bieżący wątek, znajduje się on w stanie oczekiwania w kolejce.
Lock różni się od Mutex Synchronizacja blokady między wieloma wątkami Synchronizacja wielu wątków między procesami Mutex lub synchronizacja wielu procesów W programowaniu wielowątkowym .Net często stosuje się klasy AutoResetEvent i ManualResetEvent, a ich użycie jest bardzo podobne, choć występują różnice. Metoda Set wprowadza sygnał do stanu wysyłania, metoda Reset do stanu niewysyłania, a WaitOne czeka na wysłanie sygnału. Początkowy stan konstruktora można określić na podstawie wartości parametru, jeśli jest prawdziwy, nie blokuje, a false jest stanem blokującym. Jeśli wątek wywoła metodę WaitOne, wątek otrzymuje sygnał, gdy jest w stanie wysyłania i kontynuuje wykonywanie w dół. Różnica polega na tym, że po wywołaniu AutoResetEvent.WaitOne() pozwala tylko na wejście jednego wątku naraz, a gdy wątek otrzyma sygnał, AutoResetEvent automatycznie przenosi sygnał do stanu braku wysłania, a pozostałe wątki wywołujące WaitOne mogą tylko dalej czekać. To znaczy, AutoResetEvent budzi tylko jeden wątek naraz; ManualResetEvent może wywołać wiele wątków, ponieważ gdy jeden wątek wywołuje metodę ManualResetEvent.Set(), pozostałe wątki wywołujące WaitOne otrzymują sygnał do kontynuowania wykonywania, a ManualResetEvent nie ustawia automatycznie sygnału na niewysłanie. Innymi słowy, jeśli metoda ManualResetEvent.Reset() nie zostanie wywołana ręcznie, ManualResetEvent pozostanie sygnalizowany i ManualResetEvent może obudzić wiele wątków jednocześnie, aby kontynuować wykonywanie. |