C++实现 生产者消费者模型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++实现 生产者消费者模型相关的知识,希望对你有一定的参考价值。
参考技术A condition_variable 条件变量可以用来实现线程同步,它必须与互斥量 mutex 配合使用。条件变量适用场景:一个线程先对某一条件进行判断, 如果条件不满足则进入等待, 条件满足的时候, 该线程被通知条件满足, 继续执行任务
在wait()之前,必须先lock相关联的mutex, 因为假如目标条件未满足,wait()实际上会unlock该mutex, 然后block,在目标条件满足后再重新lock该mutex, 然后返回
线程同步的方式:临界区,互斥量,信号量,事件
使用条件变量实现生产者消费者的简单例子如下:
下面实现了维护了缓冲区的结构体,并每次返回相应的位置,可以循环写入的生产者消费者模型:
知识点
c++并发练习---生产者消费者模型
问题:有一个生产者,多个消费者,生产者每生产一个,放入队列,多个消费者顺序从队列中取出数据,打印最终结果。
分析:首先这题,我本意应该设计成如下模型:生产者单开一个线程,向队列中放入数据,而消费者在锁的保护下,从队列中去数据。但是在实际编程中,发现在队列只有100个数的情况,线程不切换,当队列数据多的时候,会发生切换,但是也不是我所想象的那种随机切换,思考至今,也没有一个合理的解释/(ㄒoㄒ)/~~。最后我把题目改成了生产者没生产一个数据,就通知消费者去取,这样保证了一定的同步,但是估计或许开销会大一些。。。
如果大家有什么好的方法或者解释,请联系我,谢谢
#include<iostream> #include<thread> #include<mutex>; #include<condition_variable> #include<queue> #include<vector> std::mutex mut; std::condition_variable empty, full; std::queue<int> Q; int flag; bool over = false; void conduct(int num, int count) { for (int i = 0; i < num; i++) { std::unique_lock<std::mutex> lk(mut); empty.wait(lk); Q.push(i); flag = i % count; full.notify_all(); lk.unlock(); } over = true; } void consumer(int id, int count) { while (true) { std::unique_lock<std::mutex> lk(mut); full.wait(lk, [&]() {return flag == id; }); if (!Q.empty()) { int i = Q.front(); Q.pop(); std::cout << "thread " << id << " get " << i << std::endl; } if (over) break; empty.notify_one(); } flag = (id==count-1?0:id+1); full.notify_all(); } int main() { int count; int num; std::vector<std::thread> threads; std::cout << "请输入需要生产的数量" << std::endl; std::cin >> num; std::cout << "请输入同时进行的线程数:" << std::endl; std::cin >> count; std::thread t1(conduct, num, count); for (int i = 0; i < count; i++) threads.push_back(std::thread(consumer, i, count)); t1.join(); for (auto &t : threads) t.join(); }
以上是关于C++实现 生产者消费者模型的主要内容,如果未能解决你的问题,请参考以下文章