linux Posix執行緒同步 條件變數 例項

2021-07-02 14:13:47 字數 1943 閱讀 6820

條件變數(condtion variable)是在多執行緒程式中用來實現「等待->喚醒」邏輯常用的方法。舉個簡單的例子,應用程式a中包含兩個執行緒t1和t2。t1需要在bool變數test_cond為true時才能繼續執行,而test_cond的值是由t2來改變的,這種情況下,如何來寫程式呢?可供選擇的方案有兩種:

很明顯,上面兩種方案中,第二種方案是比較優的。在第一種方案中,在每次輪詢時,如果t1休眠的時間比較短,會導致cpu浪費很厲害;如果t1休眠的時間比較長,又會導致應用邏輯處理不夠及時,致使應用程式效能下降。第二種方案就是為了解決輪詢的弊端而生的。然而條件變數在使用的過程中,比較容易出錯,如何用得不正確的話,會適得其反的,接下來,我將詳細分析如何來使用條件變數,希望能夠給在使用條件變數過程中遇到問題的朋友有所幫助。       在開始介紹之前,需要說明一下,在接下來的介紹中,需要用到互斥鎖和條件變數相關的內容,在這裡我以linux下的pthread_mutex_t為互斥鎖型別,pthread_cond_t為條件變數型別來進行介紹,對pthread不熟的朋友,可以參考一下linux下的manual。       1. 下面是把剛開始舉的例子翻譯後的程式:

pthread_mutex_t mutex;  ///< 互斥鎖

pthread_cond_t cond; ///< 條件變數

bool test_cond = false;

/// todo 初始化mutex和cond

/// thread 1:

pthread_mutex_lock(&mutex); ///< 1

while (!test_cond)

//必須while,wait 返回不代表條件成立,可能會有別的執行緒搶先又使得條件不成立了

pthread_mutex_unlock(&mutex); ///< 4

runthread1func();

/// thread 2:

pthread_mutex_lock(&mutex); ///< 5

test_cond = true;

pthread_cond_signal(&cond);

pthread_mutex_unlock(&mutex); ///< 6

/// todo 銷毀mutex和cond

通過上面的例子,下面我來介紹一下條件變數在使用過程中需要注意的幾點(也是比較容易出錯的):       (1)條件變數的使用過程中,最為關鍵的一點是互斥鎖的使用。細心的朋友應該發現了,我在上面的例子中標了1、2、3、4、5、6個標號。在這裡1、4、5、6都是正常的lock/unlock,2、3是需要特別說明的。2是進入pthread_cond_wait後的,pthread_cond_wait調的pthread_mutex_unlock,這樣做的目的是為了保證在thread1阻塞wait後,thread2獲取同一把鎖mutex的時候,能夠正常獲取(即5,6)。3是thread1被喚醒後,要退出pthead_cond_wait之前,pthread_cond_wait調的pthread_mutex_lock,這樣做的目的是為了把mutex的控制權還給呼叫pthread_cond_wait的執行緒(即thread1)。整理一下基本的時序為:

thread 1 lock->thread 1 wait-> thread 1 unlock(in wait)

->thread 2 lock->thread 2 signal->thread 2 unlock

->thread 1 lock(in wait)->thread 1 unlock

(2)條件變數使用的過程中,通常會加乙個bool或者int的值test_cond來配合使用。這裡需要注意的一點是一定要在signal之前來改變test_cond,這樣才能保證wait的執行緒被喚醒後,能夠取到正確的test_cond的值,否則後果是不可**的。

** 

Linux Posix執行緒條件變數

生產者消費者模型 1.多個執行緒操作全域性變數n,需要做成臨界區 要加鎖 執行緒鎖或者訊號量 2.呼叫函式pthread cond wait g cond,g mutex 讓這個執行緒鎖在某乙個條件上等待 pthread cond wait 函式的本質是 拿到鎖的執行緒,把鎖暫時丟掉 解鎖 執行緒休...

執行緒同步(2)條件變數

互斥鎖有乙個明顯的缺點就是只有兩種狀態 鎖定和非鎖定,而條件變數通過允許執行緒阻塞和等待另個執行緒傳送訊號的方法來彌補互斥鎖的不足。條件變數通常和互斥鎖一起使用。條件變數的結構為pthread cond t 涉及函式 pthread cond init pthread cond detroy pth...

Linux執行緒同步 4 條件變數

分類 應用程式設計 2007 08 22 19 39 3812人閱讀收藏 舉報條件變數分為兩部分 條件和變數.條件本身是由互斥量保護的.執行緒在改變條件狀態前先要鎖住互斥量.1.初始化 條件變數採用的資料型別是pthread cond t,在使用之前必須要進行初始化,這包括兩種方式 pthread....