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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы