深入C#並行程式設計(1) -- 瞭解執行緒

Minotauros發表於2018-12-16

  一、作業系統用程式(Processe)分隔正在執行的程式,用執行緒(Thread)作為作業系統分配處理器時間的基本單元,程式上下文中可以執行多個執行緒,程式的所有執行緒共享其虛擬地址空間,所有執行緒均可執行程式程式碼中的任意部分,包括其他執行緒正在執行的程式碼;

  1.預設情況下,.NET程式只啟動單個執行緒,被稱為主執行緒(Primary Thread),也可以在執行時開啟其它執行緒,與主執行緒並行同時執行程式碼,這些執行緒被稱為工作執行緒(Worker Thread);由.Net開啟和管理的執行緒通常稱為託管執行緒(Managed Thread);

  2.託管執行緒又分為前臺執行緒和後臺執行緒,兩者類似,但前臺執行緒會阻止程式停止,而後臺執行緒不會,即當程式的Main方法結束後,只有在所有前臺執行緒都停止時,CLR才會結束該程式,此時會對仍處於活動狀態的後臺執行緒呼叫Abort方法來結束所有後臺程式;

  ※關閉程式如遇到無法關閉所有執行緒時,可以在Main方法結束前通過以下程式碼強制關閉所有執行緒,詳見:

System.Environment.Exit(0);

  二、在使用多執行緒時,不同執行緒不僅可以同時執行同一段程式碼,還可以同時訪問同一記憶體中的資料,所以會存在一定的資料衝突問題,稱為爭用條件(Race Condition):

static int MyNum;
static int RaceConditionCount;
static void MyFunc()
{
    while (true)
    {
        if (MyNum == 0)
        {
            MyNum++;
            if (MyNum == 0)
            {
                RaceConditionCount++; //只有在出現爭用條件時才會執行此語句
            }
        }
        MyNum = 0;
    }
}
static void Main(string[] args)
{
    for (int i = 0; i < 2; i++)
    {
        Thread thread = new Thread(MyFunc);
        thread.Start();
    }
    Thread.Sleep(1000);
    Console.WriteLine(RaceConditionCount); //輸出1秒內產生爭用條件的次數
    Console.Read();
} 

  1.對於爭用條件的發生頻率,釋出版本比除錯版本的出現次數多(釋出版本編譯出的程式碼被優化過而且開啟了JIT優化),多核CPU比單核CPU的出現次數多(多核CPU中多個執行緒可以同時執行,單核CPU的執行緒排程是搶佔式的,也會出現此問題,只是次數較少);

  三、為了避免產生爭用條件,需要注意資料的同步問題,可以通過給物件加鎖,使同一時間內只有一個執行緒可以執行加鎖物件所鎖定的程式碼;

 


如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的認可是我寫作的最大動力!

作者:Minotauros
出處:https://www.cnblogs.com/minotauros/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。

相關文章