深入C#並行程式設計(1) -- 瞭解執行緒
一、作業系統用程序(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/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。