6 條件變數

2021-08-21 07:35:57 字數 1481 閱讀 3361

先列出這節課的例程**.

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

std::deque

q;std::mutex mu;

void function_1()

}void function_2()

else

locker.unlock();

}}int main(int argc,char** argv)

else

這個時候,就出現了這節課的救星-條件變數,閃亮登場的時候了.

#include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

std::deque

q;std::mutex mu;

std::condition_variable cond;

void function_1()

}void function_2()

);//會將執行緒2休眠,直到執行緒1呼叫notify_one(),才會把它啟用

//條件變數可以減少執行緒2許多無謂的迴圈,換句話就是說它可以控制線程間的訪問順序

//這裡為什麼會需要locker來作為wait()的引數呢?在wait()之前,執行緒2已經被mu鎖住.

//乙個執行緒不會在被鎖住的時候休眠,在wait()實現中,會解鎖互斥物件mu,然後將其休眠.

//休眠後,又要重新加鎖,所以這裡需要傳入乙個互斥物件.因為這裡需要重複的加解鎖,所以

//這裡只能用unique_lock(),而不能使用lock_guard.

//此外,這裡執行緒2可能會被自己啟用,也就是所謂的偽啟用.

//如果碰見偽啟用,我們不希望執行緒2執行.所以我們需要為其新增第二個引數.

//當有多個像這樣的等待執行緒存在時,我們可以將cond.notify_one()改為cond.notify_all()

cout

<< "deque size :"

<< q.size() << endl;

data = q.back();

q.pop_back();

locker.unlock();

cout

<< "t2 get a number :"

<< data << endl;

}}int main(int argc,char** argv)

7 條件變數簡介

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

6 條件控制語句練習

水仙花素說明 該數每個數字上數字的冪 冪為該數的位數 等於該數自身大小n input 請輸入乙個正整數 k len n.strip m ksum 0 try n int n n1 n while true m相當於index的功能,n1為餘數,剛開始餘數為輸入的數 sum n1 10 m 1 k 更...

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

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