0

デッドロックの検出とデッドロックの回避のためのツールに関する他の投稿を読みました。しかし、私の質問は、スレッドがメインからデッドロック状態にあるときを特定して、スレッドがデッドロックされるまでメインスレッドをスリープ状態にしてさらに先に進む方法についてです。

ThreadState.WaitSleepJoin を使用して、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 を効率的なソリューションに置き換えて、すべてのスレッドがいつデッドロックされたかを調べるにはどうすればよいですか?

助けてください、どんな提案でも大歓迎です!ありがとう!

4

1 に答える 1

0

スレッドがデッドロックしている場合、メインスレッドから機能させることはできないと思います。私たちにできる唯一のことは、lock、Mutex、Monitor などを使用してデッドロックを回避しようとすることです。

于 2013-05-21T03:38:56.690 に答える