Понятия, связанные с потоками 1. Синхронизация потоков Manual ResetEvent Метод Set() устанавливает состояние в Signaled Reset(), чтобы установить сигнал на нулевой WaitOne() блокирует до тех пор, пока не появится сигнал, и если в момент вызова WaitOne есть сигнал, он не будет блокировать AutoResetEvent Отличие от ManualResetEvent в том, что AutoResetEvent.WaitOne() автоматически меняет состояние объекта события, то есть состояние события меняется каждый раз при выполнении AutoResetEvent.WaitOne(). Сигнал — > отсутствует; Нет сигнала — у > есть сигнал
example:
myResetEven.Set(), который фактически эквивалентен коммутатору, если метод set() не выполняется, следующий waitOne() не сможет дождаться уведомления, чтобы он выполнил, поэтому оператор после waitOne не будет выполнен. Метод мониторинга Механизм Wait() Pulse() используется для межпотокового взаимодействия: когда объект издаёт Monitor.Wait(), поток, обращающийся к объекту, остаётся в состоянии ожидания. пока не получит сигнал пробуждения. Monitor.Pulse() используется для передачи сигналов в ожидающий поток. То есть в критической области между Monitor.Enter() и Monitor.Exit(), чтобы снять блокировку с объекта и заблокировать текущий поток, он находится в ожидании в очереди.
Lock отличается от Mutex Синхронизация блокировки между несколькими потоками Синхронизация нескольких потоков между процессами Mutex или синхронизация нескольких процессов В .Net многопоточном программировании часто используются классы AutoResetEvent и ManualResetEvent, и их применение очень похоже, но есть различия. Метод Set переводит сигнал в состояние отправки, метод Reset — в состояние без отправки, а WaitOne ждёт отправки сигнала. Начальное состояние конструктора может быть определено значением параметра: если оно истинно, оно не блокирует, а ложное — блокирующее состояние. Если поток вызывает метод WaitOne, поток получает сигнал в состоянии отправки и продолжает выполняться вниз. Разница в том, что после вызова AutoResetEvent.WaitOne() позволяет одновременно входить только один поток, и когда поток получает сигнал, AutoResetEvent автоматически переводит сигнал в состояние отправки, а другие потоки, вызывающие WaitOne, могут продолжать ждать. То есть AutoResetEvent пробуждает только одну поток за раз; ManualResetEvent может пробудить несколько потоков, потому что когда один поток вызывает метод ManualResetEvent.Set(), другие потоки, вызывающие WaitOne, получают сигнал для продолжения выполнения, и ManualResetEvent не устанавливает автоматически сигнал на отказ от отправки. Другими словами, если метод ManualResetEvent.Reset() не вызывается вручную, ManualResetEvent останется сигнализированным, и ManualResetEvent может одновременно пробудить несколько потоков для продолжения выполнения. |