@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, но когда этот поток заканчивает свою работу, то все процесс прекращается. Почему второй поток не входит в критическую область?
  • Вопрос задан
  • 40 просмотров
Пригласить эксперта
Ответы на вопрос 1
Nipheris
@Nipheris Куратор тега C#
Ну видимо потому что второму потоку не удалось захватить блокировку, он пошёл в ветку else и, после вывода сообщения, завершил свою работу, т.к. в теле функции Run больше нет инструкций.

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

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

Войти через центр авторизации
Похожие вопросы