デッドロックの検出とデッドロックの回避のためのツールに関する他の投稿を読みました。しかし、私の質問は、スレッドがメインからデッドロック状態にあるときを特定して、スレッドがデッドロックされるまでメインスレッドをスリープ状態にしてさらに先に進む方法についてです。
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 を効率的なソリューションに置き換えて、すべてのスレッドがいつデッドロックされたかを調べるにはどうすればよいですか?
助けてください、どんな提案でも大歓迎です!ありがとう!