Linux 學習筆記 執行緒通訊總結

2021-08-30 06:32:22 字數 1337 閱讀 3366

3.3 互斥與同步的區別:

互斥:是指某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

同步:主要是流程上的概念,是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。

3.4 互斥鎖、條件變數和訊號量的區別:

互斥鎖:互斥,乙個執行緒占用了某個資源,那麼其它的執行緒就無法訪問,直到這個執行緒解鎖,其它執行緒才可以訪問。

條件變數:同步,乙個執行緒完成了某乙個動作就通過條件變數傳送訊號告訴別的執行緒,別的執行緒再進行某些動作。條件變數必須和互斥鎖配合使用。

訊號量:同步,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作。而且訊號量有乙個更加強大的功能,訊號量可以用作為資源計數器,把訊號量的值初始化為某個資源當前可用的數量,使用乙個之後遞減,歸還乙個之後遞增。

另外還有以下幾點需要注意:

1、訊號量可以模擬條件變數,因為條件變數和互斥量配合使用,相當於訊號量模擬條件變數和互斥量的組合。在生產者消費者執行緒池中,生產者生產資料後就會傳送乙個訊號 pthread_cond_signal通知消費者執行緒,消費者執行緒通過pthread_cond_wait等待到了訊號就可以繼續執行。這是用條件變數和互斥鎖實現生產者消費者執行緒的同步,用訊號量一樣可以實現!

2、訊號量可以模擬互斥量,因為互斥量只能為加鎖或解鎖(0 or 1),訊號量值可以為非負整數,也就是說,乙個互斥量只能用於乙個資源的互斥訪問,它不能實現多個資源的多執行緒互斥問題。訊號量可以實現多個同類資源的多執行緒互斥和同步。當訊號量為單值訊號量時,就完成乙個資源的互斥訪問。前面說了,訊號量主要用做多執行緒多工之間的同步,而同步能夠控制線程訪問的流程,當訊號量為單值時,必須有執行緒釋放,其他執行緒才能獲得,同乙個時刻只有乙個執行緒在執行(注意,這個執行不一定是訪問資源,可能是計算)。如果執行緒是在訪問資源,就相當於實現了對這個資源的互斥訪問。

3、互斥鎖是為上鎖而優化的;條件變數是為等待而優化的; 訊號量既可用於上鎖,也可用於等待,因此會有更多的開銷和更高的複雜性。

4、互斥鎖,條件變數都只用於同乙個程序的各執行緒間,而訊號量(有名訊號量)可用於不同程序間的同步。當訊號量用於程序間同步時,要求訊號量建立在共享記憶體區。

5、互斥量必須由同一執行緒獲取以及釋放,訊號量和條件變數則可以由乙個執行緒釋放,另乙個執行緒得到。

6、訊號量的遞增和減少會被系統自動記住,系統內部的計數器實現訊號量,不必擔心丟失,而喚醒乙個條件變數時,如果沒有相應的執行緒在等待該條件變數,此次喚醒會被丟失。

windows互斥

執行緒通訊總結

1.共享變數 記憶體 2.管道 3.handle機制 runonuithread runnable view.post runnable android 程序內的訊息驅動機制 handler,messagequeue,runnable,looper looper和message的處理機制 首先在主線...

執行緒學習筆記 4 執行緒之間通訊

子執行緒先迴圈10次,然後主線程迴圈100次,再子執行緒迴圈10次,主線程迴圈100次,就這樣迴圈往復50次。public class communtion01 start for intj 1 j 50 j class bussiness catch interruptedexception e ...

Java執行緒學習筆記(8) 執行緒間通訊

多個執行緒併發執行時,在預設情況下cpu是隨機切換執行緒的,如果我們希望他們有規律的執行,就可以使用通訊,例如每個執行緒執行一次列印 package threadtest public class demo12 catch interruptedexception e start new threa...