執行緒通訊之條件變數

2021-06-29 16:48:47 字數 2019 閱讀 3842

pthread_cond_wait()用法:

ptread_mutex_lock(&mut);

pthread_cond_wait(&cond, &mut);

pthread_mutex_unlock(&mut);

pthread_cond_signal(&cond);的用法和pthread_cond_wait是一樣的。我們先來看看pthread_cond_wait()函式。

pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)函式傳入的引數mutex用於保護條件,因為我們在呼叫pthread_cond_wait時,如果條件不成立,我們就進入阻塞,但是進入阻塞期間,如果條件變數改變了的話,我們就漏掉了這個條件。因為這個執行緒還沒有放到等待佇列上,所以呼叫pthread_cond_wait前要先鎖互斥量,即呼叫pthread_mutex_lock(), pthread_cond_wait在把執行緒放進阻塞佇列後,自動對mutex進行解鎖(它內部有自己維護乙個佇列),使得其他執行緒可以獲得加鎖的權利。這樣其它執行緒才能對臨界資源進行訪問並在適當的時候喚醒這個阻塞的程序。當pthread_cond_wait返回的時候又會自動給mutex加鎖,所以最後需要乙個pthread_mutex_unlock()函式來解鎖。

pthread_cond_signal(pthread_cond_t *cond)函式是

用來在條件滿足時,給正在等待的物件傳送資訊,表示喚醒該變數,一般和pthread_cond_wait函式聯合使用,當它接收到signal發來的訊號後,就再次鎖住mutex,一旦pthread_cond_wait鎖定了互斥物件,那麼它將返回並允許wait的執行緒繼續執行。

如下例子:

#include

#include

#include

pthread_mutex_t count_lock;

pthread_cond_t count_nonzero;

unsigned count = 0;

void * decrement_count(void *arg)

count = count -1;

pthread_mutex_unlock (&count_lock);

}void * increment_count(void *arg)

count=count+1;

pthread_mutex_unlock(&count_lock);

}int main(void)

首先,讓我們考慮以下情況:執行緒為檢視已鏈結列表而鎖定了互斥物件,然而該列表恰巧為空的,這一特定執行緒什麼也幹不了,其設計意圖是從列表中除去結點,但現在卻沒有結點。因此,它只能:鎖定互斥物件,並呼叫pthread_cond_wait。

它第一步是同時對互斥物件解鎖(於是其他執行緒可以修改已鏈結列表),並等待條件cond發生(這樣當它接收到另乙個執行緒的「訊號」時,將甦醒)。現在互斥物件已被解鎖,其他執行緒可以訪問和修改已鏈結列表,可能還會新增項。(要求解鎖並阻塞是乙個原子操作)。

此時,pthread_cond_wait呼叫還未返回。對互斥物件解鎖會立即發生,但等待條件cond通常是乙個阻塞操作,這意味著執行緒將睡眠,在它甦醒之前不會消耗cpu週期,執行緒將一直睡眠,直到特定條件發生,在這期間不會發生浪費cpu時間的繁忙查詢。從執行緒的角度來看,它只是在等待pthread_cond_wait呼叫返回。

假設另乙個執行緒(執行緒2)鎖定了mutex並對已鏈結列表新增了一項。在對互斥物件解鎖後,執行緒2會立即呼叫函式pthread_cond_broadcast(&cond)或者pthread_cond_signal(&cond)。此操作之後,執行緒2將使所有等待cond條件變數的執行緒立即熟悉。這意味著第乙個執行緒(仍處於pthread_cond_wait()呼叫中)現在將甦醒。

然後pthread_cond_wait執行最後乙個操作:重新鎖定mutex,一旦它鎖定了互斥物件,那麼pthread_cond_wait將返回並允許執行緒1繼續執行。此時,它可以馬上檢查列表,檢視它所感興趣的更改。

處理完成之後退出了函式。並呼叫pthread_mutex_unlock進行mutex的解鎖。

執行緒同步之條件變數

程序空間中有乙個儲存量a,該程序空間內存在多個執行緒,這多個執行緒都會訪問到a,或讀或寫,為了保障每個執行緒當前讀到的是正確的a而不是別的執行緒正在修改過程中的a,我們在訪問a之前需要對a進行加鎖,使得我們在訪問a的時候別的執行緒禁止訪問a,這是互斥量鎖。或者允許多個執行緒同時讀a,這是讀寫鎖。還有...

執行緒同步之條件變數

1.條件變數是鎖嗎?不是鎖,但是條件變數能夠阻塞執行緒 條件變數需要和互斥鎖一起使用 互斥量 保護一塊共享資料 條件變數 引起阻塞 2.條件變數的兩個動作?當條件滿足,通知阻塞的執行緒執行緒開始工作 條件不滿足,阻塞執行緒 3.條件變數的型別 pthread cond t 4.主要函式 初始化乙個條...

執行緒同步之條件變數

條件變數不是鎖 名字上就沒有鎖字。但可以造成執行緒阻塞,通常與互斥鎖配合使用。1 條件變數 pthread cond t cond 2 函式 以下函式返回值均是成功返回0,失敗返回錯誤號 1 pthread cond init 動態初始化,配合phtread cond destroy一起使用。或者用...