C++11实现生产者消费者模式
来源:互联网 发布:医院设备科工资知乎 编辑:程序博客网 时间:2024/06/05 08:23
并发编程中,数据产生和数据处理在不同的线程,这些线程传递数据常用的就是生产者消费者模式
以下是模仿Java的BlockingQueue实现的生产者消费者模式:
#pragma once#include <queue>#include <mutex>#include <condition_variable>enum PopResult{ POP_OK, POP_STOP, POP_UNEXPECTED };template<class T>class BlockingQueue : public std::queue<T>{public: std::mutex m_lock; std::condition_variable m_cond; bool m_stopFlag = false; virtual ~BlockingQueue() = default; void push(const T& value) { std::lock_guard<decltype(m_lock)> lock(m_lock); queue::push(value); m_cond.notify_one(); } void push(T&& value) { std::lock_guard<decltype(m_lock)> lock(m_lock); queue::push(std::move(value)); m_cond.notify_one(); } PopResult pop(T& out) { std::unique_lock<decltype(m_lock)> lock(m_lock); if (m_stopFlag) // 停止 return POP_STOP; if (empty()) m_cond.wait(lock); if (m_stopFlag) // 停止 return POP_STOP; if (empty()) // 意外唤醒? return POP_UNEXPECTED; out = std::move(front()); queue::pop(); return POP_OK; } void Stop() { std::lock_guard<decltype(m_lock)> lock(m_lock); m_stopFlag = true; m_cond.notify_all(); }};
使用方法:
#include <iostream>#include <thread>BlockingQueue<int> g_queue;// 生产者线程void Produce(){ for (int i = 0; i < 10; ++i) g_queue.push(i);}// 消费者线程void Consume(){ int data; while (true) { // 取数据 PopResult res = g_queue.pop(data); if (res == POP_STOP) // 线程应该停止 break; if (res == POP_UNEXPECTED) // 意外唤醒 continue; // 处理数据 std::cout << data << std::endl; }}int _tmain(int argc, _TCHAR* argv[]){ // 启动生产者线程和消费者线程(也可以启动多个线程) std::thread produceThread(Produce); std::thread consumerThread(Consume); // 等待数据处理完 Sleep(1000); produceThread.join(); // 停止线程 g_queue.Stop(); consumerThread.join(); return 0;}
0 0
- 生产者消费者模式实现
- 生产者消费者模式实现
- 实现生产者-消费者模式
- 生产者消费者模式实现
- 生产者消费者---C实现
- C++11实现简单生产者消费者模式
- C++11实现生产者消费者模式
- 生产者消费者模式in C
- LinkedBlockingQueue实现生产者-消费者模式
- Java生产者消费者模式实现
- 生产者消费者模式Java实现
- NSCondition实现生产者消费者模式
- 如何实现生产者消费者模式
- 生产者消费者模式Java实现
- Java实现生产者/消费者模式
- java生产者消费者模式实现
- java实现生产者消费者模式
- BlockingQueue实现生产者、消费者模式
- 二叉树12:二叉树的镜像
- 5.sqoop --options-file
- IntelliJ IDEA 使用心得与常用快捷键
- Filetype修改上传
- 2016第七届山东省赛训练总结2017/4/28
- C++11实现生产者消费者模式
- 马踏棋盘问题(骑士周游问题)及其优化算法java实现
- C++——NOIP模拟题——牧场的安排
- hihocoder 1122 : 二分图二•二分图最大匹配之匈牙利算法
- /usr/bin/ld: warning: libprotobuf.so.10 ,may conflict with libprotobuf.so.9错误的原因和解决办法
- 二叉树13:平衡二叉树
- 二、插入排序
- Linux系统Ubuntu 14.04版本下常用命令小集锦
- java接口回调