2011-12-09 79 views
14

我試圖誘導/導致線程飢餓,以觀察在C#中的影響。如何模擬C#線程飢餓

任何人都可以好好建議一個(簡單)應用程序,可以創建,以誘導線程捱餓?

回答

11

設置線程的優先級和線程親和力

Worker類

class PriorityTest 
{ 
    volatile bool loopSwitch; 
    public PriorityTest() 
    { 
     loopSwitch = true; 
    } 

    public bool LoopSwitch 
    { 
     set { loopSwitch = value; } 
    } 

    public void ThreadMethod() 
    { 
     long threadCount = 0; 

     while (loopSwitch) 
     { 
      threadCount++; 
     } 
     Console.WriteLine("{0} with {1,11} priority " + 
      "has a count = {2,13}", Thread.CurrentThread.Name, 
      Thread.CurrentThread.Priority.ToString(), 
      threadCount.ToString("N0")); 
    } 
} 

和測試

class Program 
{ 

    static void Main(string[] args) 
    { 
     PriorityTest priorityTest = new PriorityTest(); 
     ThreadStart startDelegate = 
      new ThreadStart(priorityTest.ThreadMethod); 

     Thread threadOne = new Thread(startDelegate); 
     threadOne.Name = "ThreadOne"; 
     Thread threadTwo = new Thread(startDelegate); 
     threadTwo.Name = "ThreadTwo"; 

     threadTwo.Priority = ThreadPriority.Highest; 
     threadOne.Priority = ThreadPriority.Lowest; 
     threadOne.Start(); 
     threadTwo.Start(); 

     // Allow counting for 10 seconds. 
     Thread.Sleep(10000); 
     priorityTest.LoopSwitch = false; 

     Console.Read(); 
    } 
} 

代碼大多來自msdn採取同樣,如果你有可能需要設置thread affinity多核系統。您可能還需要創建更多線程才能看到真正的飢餓。

+4

很好的例子。您可能希望將loopSwitch聲明爲volatile以防止優化問題。 – Tudor

+1

感謝您的幫助! –

+1

您沒有在代碼中包含任何關聯。在一個多核系統上,這個例子顯示兩個線程都運行了10秒(這不是預期的),除非你在開始處添加該行:Process.GetCurrentProcess()。ProcessorAffinity =(System.IntPtr)1; (它指定只能在第一個處理器上調度線程)。 – Virtlink

3

在任務管理器中爲您的應用程序設置線程關聯,使其僅在一個內核上運行。然後以高優先級在應用程序中啓動一個忙線程。

+0

是否有任何其他的方式通過純粹的編碼來做到這一點? (即沒有任務管理器部分) –

+0

@Sean查看進程屬性http://msdn.microsoft.com/en-us/library/76yt3c0w.aspx –