Синхронизация потоков, AutoResetEvent: не блокируется основной поток - C#
Формулировка задачи:
Всем добрый вечер,не понимаю почему так происходит в этом участке кода,объясните пожалуйста.
using System; using System.Threading; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static EventWaitHandle ready = new AutoResetEvent(false); static volatile string task = "begin"; static void Waiter() { ready.Set(); //даём сигнал о разрешении выполнения вызывающего потока.Если заккоментировать эту строку,то основной поток блокируется(это понятно) Console.WriteLine("Set in waiter");//Сразу выполним это,для проверки,что всё нормально } static void Main() { new Thread(Waiter).Start(); //запускаем дополнительный поток Thread.Sleep(1000); //блокируем основной на 1 секунду,чтобы сначала выполнился дополнительный ready.WaitOne(); //должен блокировать текщий поток,но Console.WriteLine(task); //всё равно это выполняется,почему? } } } //Вывод: //Set in waiter //begin
Т.е. у нас сначала выполняется метод Set() в дополнительном потоке,а только потом WaitOne() в основном. Но после WaitOne() всё равно выполняется код. Если метод Set() заккоментировать,то основной поток нормально блокируется и ожидает Set(),но наш Set() был выполнен до WaitOne()!
Надеюсь понятно объяснил...
Решение задачи: «Синхронизация потоков, AutoResetEvent: не блокируется основной поток»
textual
Листинг программы
static void Main() { new Thread(Waiter).Start(); //запускаем дополнительный поток Thread.Sleep(1000); //блокируем основной на 1 секунду,чтобы сначала выполнился дополнительный ready.WaitOne(); пройдем без проблем. ready.WaitOne(); вот тут поток будет блокирован Console.WriteLine(task); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д