2011-12-09 13 views

cevap

11

Seti iplik öncelik ve iplik yakınlık

İşçi sınıfı

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")); 
    } 
} 

Ve Test

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(); 
    } 
} 

Kod çoğunlukla thread affinity ayarlamak için ihtiyacınız olabilecek çok çekirdekli sistemine sahip ayrıca eğer msdn alınan. Gerçek açlık görmek için daha fazla iş parçacığı oluşturmanız gerekebilir.

+4

İyi örnek. Optimizasyon sorunlarını önlemek için loopSwitch'i geçici olarak bildirmek isteyebilirsiniz. – Tudor

+1

Yardımın için teşekkürler! –

+1

Kodunuza herhangi bir yakın ilgi eklemediniz. Çok çekirdekli bir sistemde, bu örnek her iki iş parçacığının başlangıcında satır eklemediğiniz sürece 10 saniyeliğine (amaçlanmayan) çalıştığını gösterir: 'Process.GetCurrentProcess(). ProcessorAffinity = (System.IntPtr) 1;' (iş parçacığının yalnızca ilk işlemcide programlanabileceğini belirtir). – Virtlink

3

Uygulamanızın iş parçacığı sırasını görev yöneticisinde ayarlayın, böylece yalnızca bir çekirdek üzerinde çalışır. Ardından, uygulamanızda yüksek öncelikli meşgul bir iş parçacığı başlatın.

+0

Sadece saf kodlama ile bunu yapmanın başka bir yolu var mı? (yani görev yöneticisi bölümü olmadan) –

+0

@Sean Bkz. işlem özellikleri http://msdn.microsoft.com/en-us/library/76yt3c0w.aspx –

İlgili konular