最近複習湯小丹的《計算機作業系統》(西安電子科技大學出版社,第三版)程序、執行緒同步章節時,發現乙個疑問。
在講程序同步時,提到了兩類方法:訊號量機制和管程機制。訊號量機制又包括四種:①整型訊號量;②記錄型訊號量;③and型訊號量;④訊號量集。如果採用整型訊號量或記錄型訊號量,則在共享多個資源時,可能出現程序死鎖的情況,因此才引入了and型訊號量。程序死鎖情況如下圖:
在講執行緒同步和通訊時,提到了三類方法:互斥鎖、條件變數和訊號量。而且提到只用互斥鎖mutex會引起死鎖,因而引入了條件變數。但是沒有想明白,如果只用mutex實現執行緒互斥,會出現上圖所示的執行緒死鎖的情況的話,引入條件變數就能夠解決了嗎?答案是不能。通過檢視《posix多執行緒程式設計》才明白,此處的指的執行緒死鎖的情況,不是上述的共享多個臨界資源的場景,而是共享乙個臨界資源出現死鎖的場景。摘錄的描述如下:當乙個執行緒互斥的訪問共享狀態時,它可能發現在其他執行緒改變狀態之前它什麼也做不了。狀態可能是對的和一致的,即沒有破壞變數,但是執行緒就是對當前狀態不感興趣。例如,乙個處理佇列的執行緒發現隊列為空時,它只能等待,直到有乙個節點被新增進佇列中。例如,共享資料由乙個互斥量保護。執行緒必須鎖住互斥量來判定佇列的當前狀態,如判定佇列是否為空。執行緒在等待之前必須釋放鎖(否則其他執行緒就不可能插入資料),然後等待佇列狀態的變化。例如,執行緒可以通過某種方式阻塞自己,以便插入執行緒能夠找到它的id並喚醒它。但這裡有乙個問題,即執行緒是執行於解鎖和阻塞之間。因此解鎖和阻塞操作必須是原子性的。
參考:
互斥鎖與條件變數
互斥鎖用於保護臨界區,使得任何時刻只有乙個執行緒在執行其中的 確切的說,互斥鎖用於保護多個執行緒或多個程序分享的共享資料。posix互斥鎖被宣告為具有pthread mutex t資料型別的變數。若互斥鎖變數是靜態分配的,則初始化為 static pthread mutex t lock pthre...
互斥鎖與條件變數
pthread cond wait總和乙個互斥鎖結合使用。在呼叫pthread cond wait前要先獲取鎖。pthread cond wait函式執行時先自動釋放指定的鎖,然後等待條件變數的變化。在函式呼叫返回之前,自動將指定的互斥量重新鎖住。int pthread cond signal pt...
互斥鎖與條件變數
條件改變這兩個操作之間存在乙個時間視窗。這裡存在著競爭。我們知道互斥量是可以用來解決上面的競爭問題的,所以條件變數本身 是由互斥量來保護的。既然判斷和睡眠是由互斥量來保護從而成為乙個原子操作,那麼其他改變條件的執行緒就應該以一致的方式修改條件 也就是說其他執行緒在改變條件狀態前也必須首先鎖住互斥量。...