Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 17115|Відповідь: 0

[Зв'язок] Детальне пояснення AutoResetEvent у .net/c#

[Копіювати посилання]
Опубліковано 20.03.2018 13:19:01 | | |

Концепції, пов'язані з потоками
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 може одночасно запускати кілька потоків для продовження виконання.




Попередній:інструмент для розбору файлів .har та HARViewer
Наступний:Реалізація розподіленого замка Zookeeper
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com