生產者和消費者模型(std::condition_variable)
阿新 • • 發佈:2018-11-15
std::condition_variable
- 為了解決死鎖而生的
- 當互斥操作不夠用而引入的
比如,執行緒可能需要等待某個條件為真才能繼續執行,而一個忙等待迴圈中可能會導致所有其他執行緒都無法進入臨界區使得條件為真時,就會發生死鎖。
所以,condition_variable 例項被創建出現主要就是用於喚醒等待執行緒從而避免死鎖。std::condition_variable的 notify_one() 用於喚醒一個執行緒
notify_all() 則是通知所有執行緒
生產者和消費者模型
#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>
#include <queue>
#include <chrono>
int main{
std::queue<int> produced_nums;//生產者數量
std::mutex m;
std::condition_variable con_var;
bool done = false;//結束標誌
bool notified = false;//通知標誌
//生產者執行緒
std::thread producer ([&](){
for(int i=0;i<5;i++){
std::this_thread::sleep_for(std::chrono::seconds(1));
std::unique_lock<std::mutex> lock(m);
std::cout<<"producing"<<i<<'\n';
produced_num.push(i);
notified = true;
cond_var.notify_one();
}
done = true;
cond_var.notify_one ();
});
//消費者執行緒
std::thread consumer([&](){
std::unique_lock<std::mutex> lock(m);
while(!done){
while(!notified){//迴圈避免虛假喚醒
cond_var.wait(lock);
}
while(!produced_nums.empty()){
std::cout<<"consuming"<<produced_nums.front()<<'\n';
produced_nums.pop;
}
notified = false;
}
});
producer.join();
consumer.join();
}