載 作業系統中的互斥鎖與條件變數

2021-09-28 16:30:18 字數 2018 閱讀 5423

**

與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。

條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:乙個執行緒等待"條件變數的條件成立"而掛起;另乙個執行緒使"條件成立"(給出條件成立訊號)。

條件的檢測是在互斥鎖的保護下進行的。如果乙個條件為假,乙個執行緒自動阻塞,並釋放等待狀態改變的互斥鎖。如果另乙個執行緒改變了條件,它發訊號給關聯的條件變數,喚醒乙個或多個等待它的執行緒,重新獲得互斥鎖,重新評價條件。如果兩程序共享可讀寫的記憶體,條件變數可以被用來實現這兩程序間的執行緒同步。

使用條件變數之前要先進行初始化。可以在單個語句中生成和初始化乙個條件變數如:

pthread_cond_t my_condition=pthread_cond_initializer;(用於程序間執行緒的通訊)。

也可以利用函式pthread_cond_init動態初始化。下面是乙個簡單的例子,我們可以從程式的執行來了解條件變數的作用。

#include

#include

#include

pthread_mutex_t mutex = pthread_mutex_initializer;/*初始化互斥鎖*/

pthread_cond_t cond = pthread_cond_initializer;/*初始化條件變數*/

void *thread1(void *);

void *thread2(void *);

int i=1;

int main(void)

void *thread1(void *junk)

}void *thread2(void *junk)

}程式建立了2個新執行緒使他們同步執行,實現程序t_b列印20以內3的倍數,t_a列印其他的數,程式開始執行緒t_b不滿足條件等待,執行緒t_a執行使a迴圈加1並列印。直到i為3的倍數時,執行緒t_a傳送訊號通知程序t_b,這時t_b滿足條件,列印i值。 

下面是執行結果:

#cc –lpthread –o cond cond.c

#./cond

thread1:1

thread1:2

thread2:3

thread1:4

thread1:5

thread2:6

thread1:7

thread1:8

thread2:9

解惑:1. 為什麼cond要和mutex連用?

考慮有這樣的情況:

in thread1:

pthread_mutex_lock(&m_mutex); 

...pthread_cond_wait(&m_cond,&m_mutex); 

...pthread_mutex_unlock(&m_mutex); 

in thread2:

pthread_mutex_lock(&m_mutex); 

...pthread_cond_signal(&m_cond); 

...pthread_mutex_unlock(&m_mutex); 

是為了應對執行緒1在呼叫pthread_cond_wait()但執行緒1還沒有進入wait cond的狀態的時候(也就是說還沒有進入等待),此時執行緒2呼叫了 cond_singal 的情況(此時執行緒2就通知執行緒1 cond 條件已經滿足)。 如果不用mutex鎖的話,這個cond_singal就丟失了,也就是說執行緒1收不到該訊號,因為此時都還沒有程序wait 狀態。加了鎖的情況是,執行緒2必須等到 mutex 被釋放(也就是 pthread_cod_wait() 進入wait_cond狀態 並自動釋放mutex) 的時候才能呼叫cond_singal.

2. pthread_cond_wait() 和 pthread_cond_signal()和鎖的關係

當呼叫pthread_cond_wait()之後,呼叫該函式的執行緒進入睡眠,同時開啟mutex

當呼叫pthread_cond_signal()之後,呼叫該函式的執行緒開啟mutex

互斥鎖與條件變數

最近複習湯小丹的 計算機作業系統 西安電子科技大學出版社,第三版 程序 執行緒同步章節時,發現乙個疑問。在講程序同步時,提到了兩類方法 訊號量機制和管程機制。訊號量機制又包括四種 整型訊號量 記錄型訊號量 and型訊號量 訊號量集。如果採用整型訊號量或記錄型訊號量,則在共享多個資源時,可能出現程序死...

互斥鎖與條件變數

互斥鎖用於保護臨界區,使得任何時刻只有乙個執行緒在執行其中的 確切的說,互斥鎖用於保護多個執行緒或多個程序分享的共享資料。posix互斥鎖被宣告為具有pthread mutex t資料型別的變數。若互斥鎖變數是靜態分配的,則初始化為 static pthread mutex t lock pthre...

互斥鎖與條件變數

pthread cond wait總和乙個互斥鎖結合使用。在呼叫pthread cond wait前要先獲取鎖。pthread cond wait函式執行時先自動釋放指定的鎖,然後等待條件變數的變化。在函式呼叫返回之前,自動將指定的互斥量重新鎖住。int pthread cond signal pt...