Как определить, когда потоки зашли в тупик из Main C#

Я читал другие посты об инструментах для обнаружения тупиков и их предотвращения; но мой вопрос конкретно о том, как найти, когда потоки находятся в тупике от Main, чтобы я мог заставить основной поток спать, пока потоки не будут заблокированы и продолжать работу.

Я попытался использовать ThreadState.WaitSleepJoin, чтобы определить, не заблокированы ли все потоки в течение длительного периода времени в Main, но это не похоже на работу; Существуют ли какие-либо служебные методы для определения взаимоблокировки всех потоков?

Я пытаюсь реализовать сценарий взаимоблокировки в "Обедающих философах", где, когда все потоки сначала берут палку вправо или влево, они будут ждать другую палочку вечно, и, следовательно, возникает тупик; Единственная проблема заключается в том, что я не могу найти, когда все эти потоки всегда переходят в состояние ожидания от Main.

Это мой метод Run:

public virtual void Run()
    {
        while (!stop)
        {
            Random random = new Random();
            try
            {
                outputList.Add("Thinking", identity);
                Thread.Sleep(random.Next(1, 100000000));

                outputList.Add("Hungry", identity);
                right.get();
                outputList.Add("Got Right", identity);

                Thread.Sleep(random.Next(1, 100000000));

                left.get();
                outputList.Add("Got Left", identity);
                outputList.Add("Eating", identity);

                Thread.Sleep(random.Next(1, 100000000));
                right.put();
                left.put();
            }
            catch (Exception e)
            { }
        }
    }

Это главное:

      public static List<DiningState> MainFunction(int numberPhilosophers)
      {
        Thread[] phil = new Thread[numberPhilosophers];
        ChopStick[] fork = new ChopStick[numberPhilosophers];
        DeadlockDiningPhilosopherController ph = null;

        for (int i = 0; i < numberPhilosophers; ++i)
        {
            fork[i] = new ChopStick(i);
        }

        Stopwatch time = Stopwatch.StartNew();

        for (int i = 0; i < numberPhilosophers; ++i)
        {
            ph = new DeadlockDiningPhilosopherController(i, fork[(i - 1 + numberPhilosophers) % numberPhilosophers], fork[i]);
            phil[i] = new Thread(new ThreadStart(ph.Run));
            phil[i].Start();
        }

        for (int i = 0; i < numberPhilosophers; i++)
        {
            if (phil[i].ThreadState != System.Threading.ThreadState.WaitSleepJoin)
            {
                i = i - 1;
                Thread.Sleep(10000);
            }
            else
            {
                continue;
            }
        }
        for (int i = 0; i < numberPhilosophers; i++)
        {
            if (phil[i].ThreadState == System.Threading.ThreadState.WaitSleepJoin)
            {
                phil[i].Abort();
            }
        }
        time.Stop();

        int timespan = (int)time.Elapsed.TotalSeconds;
        Console.WriteLine("Total Time: " + time.Elapsed.TotalMilliseconds + time.Elapsed.TotalSeconds);

        return outputList;
     }

Как я могу заменить WaitSleepJoin эффективным решением, чтобы узнать, когда все потоки заблокированы?

Пожалуйста, помогите, любые предложения с благодарностью! благодарю вас!

1 ответ

Если поток заблокирован, я не думаю, что вы можете заставить его работать из основного интерфейса. Единственное, что мы можем сделать, это попытаться избежать тупиковой ситуации с помощью блокировок, мьютекса, монитора и т. Д.

Другие вопросы по тегам