#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>
#include <list>
#include <chrono>
using namespace std;
int main(int argc, char *argv[])
{
std::list<int> producd_nums;
std::mutex mut_test;
std::condition_variable con_var;
bool done = false;
bool notified = false;
//生产者线程
std::thread producer([&]()
{
int i;
std::this_thread::sleep_for(std::chrono::seconds(1));
for(i=0; i<1000; i++)
{
//do something...
//进临界区
{
std::unique_lock<std::mutex> lock(mut_test);
produced_nums.push_back(i);
std::cout<<"producing..."<<i<<'\n';
cond_var.notify_one();
}
//出临界区,自动解锁
//contiune do something...
}
done = true; //产结束了
std::this_thread::sleep_for(std::chrono::seconds(3));
});
//消费者线程
std::thread consumer([&]()
{
while(!done)
{
{
std::unique_lock<std::mutex> lock(mut_test);
cond_var.wait(lock); //此时等待通知,同时解锁,并阻塞。收到通知,会继续自动加锁
//临界区
while(!produced_nums.empty()) //进一步判断,链表是否有数据。避免假消息
{
std::cout<<"consuming"<<produced_nums.front()<<'\n';
produced_nums.pop_front();
}
//临界区结束
}
//continue do something
}
});
producer.join();
consumer.join();
}
C++11 多线程生产者消费之模型
最新推荐文章于 2024-05-20 16:22:53 发布