Я прочитал другие сообщения об инструментах обнаружения тупиковой ситуации и избегания тупика; но мой вопрос конкретно о том, как найти, когда потоки находятся в тупике от Main, так что я могу сделать Main thread sleep до тех пор, пока потоки не закроются и не начнут двигаться дальше.Как определить, когда потоки находятся в тупике от Main C#
Я попытался использовать 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)
{ }
}
}
Это Main:
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 с эффективным решением, чтобы выяснить, когда все потоки зашли в тупик?
Пожалуйста, помогите, любые предложения приветствуются! Спасибо!
Ну, в общем случае вы говорите о решении проблемы с остановкой, что [классно] невозможно. Вы действительно можете только догадываться, и даже тогда, как правило, лучше всего писать программы, которые, как вы уверены, не могут затормозить, чем пытаться обнаружить его во время выполнения. – Servy
@Servy: Спасибо за ответ. Если это так, я видел анимацию «Обеденного философа», где они показывают сценарий тупиковой ситуации, где они показывают, когда программа переходит в состояние взаимоблокировки. Как я могу достичь такого поведения? Если какие-либо предложения, пожалуйста, дайте мне знать! – inspiringmyself
Ну, во-первых, это довольно тривиальная проблема. О таком же тривиальном, как и в отношении тупиков. Есть * много решений, так как это буквально самый распространенный пример учебника для того, как создавать и, следовательно, решать такие проблемы. У каждого человека есть своя задача о том, как сделать рабочую версию. Некоторые пытаются обнаружить тупик, другие бросают тайм-ауты на то, как они держат замок, а другие изменяют способы приобретения ресурсов, так что становится невозможным затормозить. Вообще говоря, я предпочитаю последний подход. – Servy