對pthread cond wait 函式的理解

2021-06-06 12:33:55 字數 1833 閱讀 7141

原文:

了解 pthread_cond_wait() 的作用非常重要 -- 它是 posix 執行緒訊號傳送系統的核心,也是最難以理解的部分。 

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

鎖定互斥物件時,執行緒將呼叫 pthread_cond_wait(&mycond,&mymutex)。pthread_cond_wait() 呼叫相當複雜,因此我們每次只執行它的乙個操作。 

pthread_cond_wait() 所做的

第一件事

就是同時對互斥物件解鎖(於是其它執行緒可以修改已鏈結列表),並等待條件 mycond 發生(這樣當 pthread_cond_wait() 接收到另乙個執行緒的「訊號」時,它將甦醒)。現在互斥物件已被解鎖,其它執行緒可以訪問和修改已鏈結列表,可能還會新增項。 【

要求解鎖並阻塞是乙個原子操作

】此時,pthread_cond_wait() 呼叫還未返回。對互斥物件解鎖會立即發生,但等待條件 mycond 通常是乙個阻塞操作,這意味著執行緒將睡眠,在它甦醒之前不會消耗 cpu 週期。這正是我們期待發生的情況。執行緒將

一直睡眠,直到特定條件發生

,在這期間不會發生任何浪費 cpu 時間的繁忙查詢。從執行緒的角度來看,它只是在等待 pthread_cond_wait() 呼叫返回。 

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

甦醒

。 現在,看一下第乙個執行緒發生了什麼。您可能會認為在 2 號執行緒呼叫 pthread_cond_broadcast(&mymutex) 之後,1 號執行緒的 pthread_cond_wait() 會立即返回。不是那樣!實際上,pthread_cond_wait() 將執行最後乙個操作:

重新鎖定 mymutex

。一旦 pthread_cond_wait() 鎖定了互斥物件,那麼它將返回並允許 1 號執行緒繼續執行。那時,它可以馬上檢查列表,檢視它所感興趣的更改。 

停止並回顧!

那個過程非常複雜,因此讓我們先來回顧一下。第乙個執行緒首先呼叫: 

pthread_mutex_lock(&mymutex); 

然後,它檢查了列表。沒有找到感興趣的東西,於是它呼叫: 

pthread_cond_wait(&mycond, &mymutex); 

然後,pthread_cond_wait() 呼叫在返回前執行許多操作: 

pthread_mutex_unlock(&mymutex); 

它對 mymutex 解鎖,然後進入睡眠狀態,等待 mycond 以接收 posix 執行緒「訊號」。一旦接收到「訊號」(加引號是因為我們並不是在討論傳統的 unix 訊號,而是來自 pthread_cond_signal() 或 pthread_cond_broadcast() 呼叫的訊號),它就會甦醒。但 pthread_cond_wait() 沒有立即返回 -- 它還要做一件事:重新鎖定 mutex: 

pthread_mutex_lock(&mymutex); 

pthread_cond_wait() 知道我們在查詢 mymutex 「背後」的變化,因此它繼續操作,為我們鎖定互斥物件,然後才返回。

對建立游標對理解

步驟 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...