1. 程式人生 > 實用技巧 >c# 執行緒的優先順序

c# 執行緒的優先順序

前言

有時候我們希望某個執行緒更加重要,希望讓其先執行的話。c#為我們提供了執行緒修改優先順序。但是這樣的效果有多大呢?

正文

直接放程式碼:

static void Main(string[] args)
{
Console.WriteLine($" current thread priority:{Thread.CurrentThread.Priority }");
Console.WriteLine("Running on all cores available");
RunThreads();
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine("Rinning on single core");
Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1);
RunThreads();
Thread.Sleep(TimeSpan.FromSeconds(5));
Console.ReadLine();
}
static void RunThreads()
{
var simple = new SampleTread();
var threadOne = new Thread(simple.countNumber);
threadOne.Name = "ThreadOne";
var ThreadTwo = new Thread(simple.countNumber);
ThreadTwo.Name = "ThreadTwo";
threadOne.Priority = ThreadPriority.Highest;
ThreadTwo.Priority = ThreadPriority.Lowest;
threadOne.Start();
ThreadTwo.Start();
Thread.Sleep(TimeSpan.FromSeconds(2));
simple.Stop();
}
class SampleTread
{
private bool _isStopped = false;
public void Stop()
{
_isStopped = true;
}
public void countNumber()
{
long counter = 0;
while (!_isStopped)
{
counter++;
}
Console.WriteLine($"{Thread.CurrentThread.Name} with" + $"{ Thread.CurrentThread.Priority,11}" + $"has a count={counter:13:No}");
}
}

結果

我們發現兩次執行的結果並不同:

上訴結果是因為我們有多個核,即使我們設定了優先順序在多個核上也是並行的。

而我使用Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1);

讓程式執行在單核上,我們發現其實一直在等待的。

這是因為一直在執行threadOne,等執行緒超時了,然後是ThreadTwo ,只有當作業系統讓他們超時了才讓他們退出。

而我發現在單核上,基本是高優先順序先輸出。

我也把啟動順序換了。

static void RunThreads()
{
var simple = new SampleTread();
var threadOne = new Thread(simple.countNumber);
threadOne.Name = "ThreadOne";
var ThreadTwo = new Thread(simple.countNumber);
ThreadTwo.Name = "ThreadTwo";
threadOne.Priority = ThreadPriority.Highest;
ThreadTwo.Priority = ThreadPriority.Lowest;
threadOne.Start();
ThreadTwo.Start();
Thread.Sleep(TimeSpan.FromSeconds(2));
simple.Stop();
}

得到的同樣是:

先不說100%,在單核上是有一些作用的,但是多執行緒在單核上跑意義多大呢?是可以調節在每個單核上的競爭性。

總結

這種設定優先順序的是適合高併發調優的,因為高併發在單核上還是還是存在競爭性的,而不適合兩個執行緒之間去確定誰先執行。