對pthread cond wait的理解

2021-10-04 11:07:26 字數 1793 閱讀 1096

目錄

pthread_cond_wait出現的目的

pthread_cond_wait實現之中為什麼要加鎖和解鎖

**之中為什麼要用while

函式原型

int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
pthread_cond_wait:呼叫其函式有三個步驟1、對其傳入的mutex進行解鎖2、等待pthread_cond_signal的喚醒(阻塞在這裡)3、喚醒後重新對其進行加鎖

如果不存在訊號量,則生產者和消費者可能是這個樣子(來自)

apue上這樣解釋:這就關閉了條件檢查和執行緒進入休眠(休眠一段時間再次進行檢查)狀態等待這兩個操作之間的時間通道,也就是說,條件一旦滿足,直接就喚醒了消費者,不需要睡眠那段時間

解鎖:我的理解是,如果有兩個執行緒,a執行緒是生產者執行緒,b執行緒是消費者執行緒如果b執行緒先到鎖,執行到pthread_cond_wait,如果沒有解鎖,直接阻塞,那麼a執行緒(生產者)永遠也沒有機會拿到鎖,造成永久堵塞,因為鎖一直沒b執行緒(消費者)占用

加鎖:我理解就是讓執行緒a(生產者)thread_cond_signal ----->到unlock之間**可以及時執行,因為只有unlock之後, b執行緒中pthread_cond_wait 內部才能夠加鎖成功,   還有一點就是返回前再次鎖mutex是為了保證執行緒從pthread_cond_wait返回後到再次條件判斷前不被改變, 就是a拿到鎖了,消費過程中其他執行緒是不允許消費的

lock(&mutex);

//一些操作

pthread_cond_signal(&cond);

//一些操作

unlock(&mutex);

上述為生產者**,現在比如消費者執行緒有兩個,分別為m,n,這兩個消費者同時阻塞在pthread_cond_wait上(乙個消費者執行緒pthread_cond_wait解鎖後,鎖被其他消費者執行緒拿到,也到了pthread_cond_wait函式),如果消費者pthread_cond_signal了,因為pthread_cond_signal只會喚醒pthread_cond_wait上的執行緒,那麼m,n同時被喚醒,m先拿到鎖,消費了,剛消費完解鎖後,n執行緒後拿到了鎖,此時沒有什麼可消費的了,條件不滿足了,只能用while,重新等待,這也就是所謂的  驚群效應 

(驚群效應比較好的文章)

**還有一種寫法是

lock(&mutex);

//一些操作

unlock(&mutex);

//一些操作

pthread_cond_signal(&cond);

這種寫法在執行完unlock之後,還沒來的及執行pthread_cond_signal,可能有一些空閒的執行緒直接消費了,那麼之後喚醒的執行緒也不滿足了,所以也要用while參考部落格:

對建立游標對理解

步驟 1 首先經過底層的 編寫已經建立起了了python和資料庫之間的溝通橋梁並封裝成了模組,通過pymysql下的conntent 方法與之建立起了連線,例項物件。pymysql.connect 方法返回的是connections模組下的connection 例項,connect 方法傳參就是在給...

對勾函式 對勾函式

對勾函式是一種類似於反比例函式的一般函式。所謂的對勾函式,是形如 f x ax b x 的函式,是 一種教材上沒有但考試老喜歡考的函式,所以更加要注意和學習。一般的函式影象形似兩個中心對稱的 對勾,故名。當x 0 時,f x ax b x 有最小值 這裡為了研究方便,規定a 0 b 0 也就是當 x...

一對多 多對一

pip install djangorestframework 3.9.2 pip install markdown 3.0.1 markdown support for the browsable api.pip install django filter 2.1.0 filtering supp...