700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C++多线程实现生产者消费者模式

C++多线程实现生产者消费者模式

时间:2023-08-10 09:04:21

相关推荐

C++多线程实现生产者消费者模式

这里记录C++多线程实现生成者消费者模式。

代码执行环境:wins Visual Studio

执行逻辑:生产者和消费者公用一个队列作为临界资源,当队列满时生产者暂停生成;当队列为空时,消费者暂停消费。使用锁来保证队列中数据的一致性。

执行结果截图:

#include<iostream>#include<vector>#include<thread>#include<queue>#include<mutex>#include<Windows.h>using namespace std;class MultiThreadProduceConsume {private:condition_variable produce_msgQueue;condition_variable consume_msgQueue;mutex mtx;vector<std::thread> tpool;private:queue<int> item_buff;const int buffsize;static int item_id;int c_no, p_no;private:void producItem() {while (true) {std::unique_lock<mutex> lck(mtx);while (item_buff.size() == buffsize) {produce_msgQueue.wait(lck);}Sleep(10);item_id = item_id++ %buffsize;item_buff.push(item_id);cout << "product item id: " << item_id << endl;consume_msgQueue.notify_all();lck.unlock();}}void consumeItem() {while (true) {std::unique_lock<mutex> lck(mtx);while (item_buff.empty()) {cout << "wait product" << endl;consume_msgQueue.wait(lck);}Sleep(10);cout << "customer id : " << this_thread::get_id() << endl;cout << "consume Item id: " << item_buff.front() << endl;item_buff.pop();produce_msgQueue.notify_one();lck.unlock();}}public:MultiThreadProduceConsume(int size = 10, int pno = 1, int cno = 5) :buffsize(size), p_no(pno), c_no(cno) {};void run() {productTask();customerTask();for (auto &i : tpool) {i.join();}}void productTask() {for (int i = 0; i < p_no; i++) {tpool.emplace_back(thread(&MultiThreadProduceConsume::producItem, this));}}void customerTask() {for (int i = 0; i < c_no; i++) {tpool.emplace_back(thread(&MultiThreadProduceConsume::consumeItem, this));}}};int MultiThreadProduceConsume::item_id = 0;int main(){MultiThreadProduceConsume t;t.run();system("pause");return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。