7 條件變數簡介

2021-06-17 17:50:32 字數 1553 閱讀 2620

條件變數,先談談自己的理解吧!

互斥量解決了不同執行緒處理共享資源的問題,比如有倆執行緒one和two以及和乙個共享資源share,one和two每次處理share的前提都是成功獲取互斥量mutex,這樣的做法保證了共享資源在一段時間裡只被乙個執行緒處理,也即保證了處理共享資源的原子性。

但這還不夠,常常會有這樣的應用需求(mark nb),執行緒one處理完共享資源share之後,需要通知處於阻塞狀態的two執行緒來接著進行處理。單是互斥量能夠解決這樣的問題嗎?

顯然不行,單是使用互斥量,若不計one執行緒和two執行緒處理程式的複雜性,那麼one執行緒和two執行緒處理share的機會是均等的,但是,mark nb這樣的應用需求下,明顯one執行緒對共享資源share的占用更有優勢。舉例,one執行緒獲取共享資源share,two執行緒把共享資源share處理成share_after:

one thread:

while (1)

}two thread:

while (1)

這種只是使用到了互斥量的程式設計合格嗎?

顯然不合格!這樣會造成這樣的問題產生,執行緒one還沒成功獲取到新的share,執行緒two就已經有機會對「老的」share進行處理了。而事實上,我們需要的one執行緒每「if (ok)」一次,two才有機會執行一次。

如何能滿足這樣的需求呢?

條件變數!

關於對條件變數的解釋,有文獻曰:條件變數是用來通知共享資料的狀態資訊的機制。

在這種機制下,能夠實現這樣的功能:執行緒two平時都是處於阻塞狀態,直到執行緒one在if(ok)中啟用它,使它有機會執行一次,下乙個while迴圈又重新處於阻塞狀態,等待執行緒one下一次的「召喚」。

來看看如何用**完成這樣的機制吧!值得一提的是,由於涉及共享資料,因此條件變數是結合互斥量來使用的。

建立和銷毀條件變數

posix用pthread_cond_t型別的變數來表示條件變數。程式必須在使用pthread_cond_t變數之前對其進行初始化。

對於那些靜態分配的、使用預設屬性的pthread_cond_t變數來說,可以直接將pthread_cond_initializer賦給變數就可以完成初始化。如下:

pthread_mutex_t mutex = pthread_mutex_initializer;

對那些動態分配的或不使用預設屬性的變數來說,就要呼叫pthread_cond_init函式來進行初始化。該函式的形式為:

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); 

引數attr是乙個條件變數屬性物件,如果將null傳遞給attr,則初始化乙個具有預設屬性的條件變數,否則,就要用與執行緒屬性物件類似的方式,先建立乙個條件變數屬性物件,再設定它。

函式pthread_cond_destory銷毀乙個條件變數,該函式的形式為:

int pthread_cond_destory(pthread_cond_t *cond);

暫時就介紹到這裡吧,說得再多還不如看看**示例。

接著可以看後面的文章...

Python執行緒專題7 條件變數

python執行緒專題6 事件 python執行緒專題8 使用鎖的注意事項 條件變數時構建在另乙個鎖上的同步原語,當需要執行緒關注特定的狀態變化或事件發生時將使用這個鎖。典型的用法是生產者與消費者問題,其中乙個執行緒生產的資料提供給另外乙個執行緒使用。c condition lock 穿件新的條件變...

6 條件變數

先列出這節課的例程 include include include include include include include using namespace std std deque q std mutex mu void function 1 void function 2 else lo...

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

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