Синхронизация потоков, 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);
}