1. 程式人生 > 其它 >淺談C++中的多執行緒(二)

淺談C++中的多執行緒(二)

C++多執行緒併發程式設計視訊:https://pan.baidu.com/s/1bpZW6bHPsf_upFbWcda-Pg

提取碼:1ue5

本篇文章圍繞以下幾個問題展開:

3、同步互斥原理以及多程序和多執行緒中實現同步互斥的兩種方法
4、Qt中的多執行緒應用


上一篇文章講解了前兩個問題,本篇文章來講解第三個問題。

三.同步互斥原理以及多程序和多執行緒中實現同步互斥的兩種方法
1.同步互斥原理
同步互斥其實包含兩個概念:同步和互斥。同步是合作程序(或執行緒)間的直接制約問題,互斥是申請臨界資源程序(或執行緒)間的直接制約問題。

備註:個人認為,多程序和多執行緒中都存在著同步互斥問題,但下面的內容主要講解多執行緒中的同步互斥,一方面是C++11中更多使用的是多執行緒來解決併發問題,另一方面本篇文章的重點也是講解C++11中的多執行緒。

首先說明兩個專業名詞。

臨界資源:對於同一程序的多個執行緒,程序資源中有些對執行緒是共享的,但有些資源一次只能供一個執行緒使用,這樣的資源被稱為臨界資源,也可以叫做互斥資源,即只能被各個執行緒互斥訪問。

臨界區:執行緒中對臨界資源實施操作的那段程式,稱之為臨界區。

1.1.執行緒間的同步
執行緒的同步是指在一些確定點上需要執行緒之間相互合作,協同工作。個人認為,說白了就是在訪問同一個臨界資源(互斥資源)時,兩個執行緒間必須有一個先後順序,因為臨界資源一次只能供一個執行緒使用,如果兩個執行緒都想要訪問,那豈不亂套了,這回形成死鎖,後面會講。

舉例:假如程式中有一個靜態變數,static int a;執行緒1負責往裡寫入資料,執行緒2需要讀取其中的資料,那麼執行緒2在讀資料之前必須是執行緒1寫入了資料,如果不是,那麼執行緒2必須停下來等待執行緒1的操作結束。這就是執行緒之間在某些地方上的合作關係,協同工作嘛!

1.2.執行緒間的互斥
執行緒的互斥是指同一程序中的多個執行緒之間因爭用臨界資源而互斥的執行,即一次只能有一個執行緒訪問臨界資源。

舉例:還是假如程式中有一個靜態變數,static int b;執行緒1想要往裡寫入資料,執行緒2也想要往裡寫入資料,那麼此時靜態變數b就是一個臨界資源(互斥資源),即一次只能被一個執行緒訪問。想一想,如果執行緒1和執行緒2同時往b中寫入資料,那怎麼能行,計算機是不允許的!所以,要麼是執行緒1佔用b,此時執行緒2要等待;要麼是執行緒2佔用b,此時執行緒1等待。這就是所謂的執行緒間的互斥,這裡可以通過加鎖的方式來實現,後面會講。

備註:在這裡要說明一下自己認識上的一個錯誤,之前我以為 同步是對於執行緒來說的,而互斥是對於臨界資源來說的,現在看來這是錯誤的,因為同步跟互斥都是針對於執行緒來說的,可以把這理解為是執行緒之間的合作關係和制約關係。可以這樣理解,同一程序的各個執行緒之間不可能是完全獨立的,或多或少會有關係,或是合作關係,或是制約關係。具體的例子放在了同步和互斥的介紹中。

2.多執行緒中實現同步互斥的兩種方法
C++11中實現多執行緒間同步與互斥有兩種方法:訊號量機制和鎖機制,其中鎖機制最為常用。

3.多程序中實現同步互斥的兩種方法
多程序中實現同步互斥仍然可以採用訊號量機制和鎖機制,但個人理解在語言實現上是用作業系統的原語,難於理解,所以這裡不再贅述,只需要掌握其原理即可。

有沒有發現,其實程序和執行緒有很多相像的地方,因為執行緒被稱為是輕量化程序嘛!