2013-05-21 1 views
0

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

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

+0

Ну, в общем случае вы говорите о решении проблемы с остановкой, что [классно] невозможно. Вы действительно можете только догадываться, и даже тогда, как правило, лучше всего писать программы, которые, как вы уверены, не могут затормозить, чем пытаться обнаружить его во время выполнения. – Servy

+0

@Servy: Спасибо за ответ. Если это так, я видел анимацию «Обеденного философа», где они показывают сценарий тупиковой ситуации, где они показывают, когда программа переходит в состояние взаимоблокировки. Как я могу достичь такого поведения? Если какие-либо предложения, пожалуйста, дайте мне знать! – inspiringmyself

+0

Ну, во-первых, это довольно тривиальная проблема. О таком же тривиальном, как и в отношении тупиков. Есть * много решений, так как это буквально самый распространенный пример учебника для того, как создавать и, следовательно, решать такие проблемы. У каждого человека есть своя задача о том, как сделать рабочую версию. Некоторые пытаются обнаружить тупик, другие бросают тайм-ауты на то, как они держат замок, а другие изменяют способы приобретения ресурсов, так что становится невозможным затормозить. Вообще говоря, я предпочитаю последний подход. – Servy

ответ

0

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

+0

Спасибо вам за ответ. Если это так, я видел анимацию «Обеденного философа», где они показывают сценарий тупиковой ситуации, где они показывают, когда программа переходит в состояние взаимоблокировки. Как я могу достичь такого поведения? Если какие-либо предложения, пожалуйста, дайте мне знать! – inspiringmyself

Смежные вопросы