@Aleviy

Почему при использовании конструкции TryEnter() не запускается второй поток?

using System;
using System.Threading;


class Demo 
{
    static int Count;
    static object Locker = new object();
    static void Main() 
    {
        Thread ob = new Thread(Run);
        ob.Name = "first ";
        Thread ob1 = new Thread(Run);
        ob1.Name = "second ";
        ob.Start();
        ob1.Start();
        ob.Join();
        ob1.Join();
    }

    public static void Run() 
    {
        if (Monitor.TryEnter(Locker)) 
        {
            do
            {
                Thread.Sleep(100);
                Console.WriteLine(Thread.CurrentThread.Name + " вошел " + Count);
                Count++;

            } while (Count < 10);
            Console.WriteLine(Thread.CurrentThread.Name + " закончил свою работу");
            Count = 0;
            Monitor.Exit(Locker);
        }
        else 
        {
            Console.WriteLine("Не вошел " + Thread.CurrentThread.Name);
        }
    }
        
}


Собственно, один из потоков блокируется объектом object, но когда этот поток заканчивает свою работу, то все процесс прекращается. Почему второй поток не входит в критическую область?
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
Nipheris
@Nipheris Куратор тега C#
Ну видимо потому что второму потоку не удалось захватить блокировку, он пошёл в ветку else и, после вывода сообщения, завершил свою работу, т.к. в теле функции Run больше нет инструкций.

Странно, что вы это спрашиваете, если писали этот код.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы