Как определить, когда потоки зашли в тупик из 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 ответ
Если поток заблокирован, я не думаю, что вы можете заставить его работать из основного интерфейса. Единственное, что мы можем сделать, это попытаться избежать тупиковой ситуации с помощью блокировок, мьютекса, монитора и т. Д.