Концепції, пов'язані з потоками 1. Синхронізація потоків ManualResetEvent Метод Set() встановлює стан у Signaled Reset(), щоб встановити сигнал no WaitOne() блокуватиме, доки не з'явиться сигнал, і якщо сигнал є під час виклику WaitOne, він не блокуватиме AutoResetEvent Відмінність від ManualResetEvent полягає в тому, що AutoResetEvent.WaitOne() автоматично змінює стан об'єкта події, тобто стан події змінюється щоразу при виконанні AutoResetEvent.WaitOne(). Сигнал — > без сигналу; Немає сигналу — > має сигнал
example:
myResetEven.Set(), що фактично еквівалентно комутатору; якщо метод set() не виконується, наступний waitOne() не зможе дочекатися сповіщення, щоб дозволити його виконати, тому оператор після waitOne не буде виконаний. Метод моніторингу Механізм Wait() Pulse() використовується для міжпотокової взаємодії, коли об'єкт випромінює Monitor.Wait(), потік, що звертається до об'єкта, залишається у стані очікування. поки не отримає сигнал пробудження. Monitor.Pulse() використовується для передачі сигналів у потік очікування. Тобто, у критичній зоні між Monitor.Enter() і Monitor.Exit(), щоб зняти блокування об'єкта і заблокувати поточний потік, він перебуває у стані очікування в черзі.
Блокування відрізняється від Mutex Синхронізація блокування між кількома потоками Синхронізація кількох потоків між процесами Mutex або синхронізація кількох процесів У багатопотоковому програмуванні .Net часто використовуються класи AutoResetEvent і ManualResetEvent, і їх застосування дуже схоже, але є відмінності. Метод Set переводить сигнал у стан відправлення, метод Reset — у стан без відправки, а WaitOne чекає на передачу сигналу. Початковий стан конструктора можна визначити значенням параметра: якщо він істинний, він не блокує, а false — це стан блокування. Якщо потік викликає метод WaitOne, він отримує сигнал у стані відправлення і продовжує виконувати його вниз. Різниця в тому, що після виклику AutoResetEvent.WaitOne() дозволяє одночасно входити лише одному потоку, і коли потік отримує сигнал, AutoResetEvent автоматично переводить сигнал у стан «нуль», а інші потоки, що викликають WaitOne, можуть лише продовжувати чекати. Тобто, AutoResetEvent пробуджує лише один потік одночасно; ManualResetEvent може розбуджувати кілька потоків, оскільки коли один потік викликає метод ManualResetEvent.Set(), інші потоки, що викликають WaitOne, отримують сигнал для продовження виконання, і ManualResetEvent не встановлює автоматично сигнал на невідправлення. Іншими словами, якщо метод ManualResetEvent.Reset() не викликається вручну, ManualResetEvent залишиться сигналізованим, і ManualResetEvent може одночасно запускати кілька потоків для продовження виконання. |