windows平台一个高性能、通用型的C++生产者/消费者架构模板
来源:互联网 发布:http端口号设置 编辑:程序博客网 时间:2024/06/03 19:56
/*生产者/消费者通用模板特点:高性能:采用多线程,多队列平衡的信号量等待模型,有效减少锁等待可调节:可以根据实际应用环境调整队列数,最多可支持64个队列使用简单,一个构造函数,一个生产函数,一个消费函数。*/#ifndef PANDC_H#define PANDC_H #include <vector>#include <deque>#include <windows.h>#include <limits.h> using namespace std; enum QueueType{ qtFIFO, qtFILO};//T生产的对象template<typename t="">class Pandc{public: //构造函数, QUEUE_COUNT是队列数 QT:先进先出还是先进后出 Pandc(unsigned long QUEUE_COUNT,QueueType QT); ~Pandc(); void P(T obj); //生产 bool C(/*out*/T &ret); //消费 long ItemCount(){return m_item_count;} long QueueItemCount(unsigned long queue_id);private: Pandc(const Pandc&); Pandc& operator=(const Pandc&);private: volatile LONG m_queue_id; //当前队列ID; vector<deque<t>* > m_queues; //队列 vector<rtl_critical_section*> m_queuelocks; //队列锁 HANDLE *m_semaphores; //队列信号量 unsigned long m_queue_count; //队列数 QueueType m_queue_type; //进出队列方式 FIFO/FILO volatile LONG m_item_count; //队列中的总条目数}; template<typename t="">long Pandc<t>::QueueItemCount( unsigned long queue_id ){ if (queue_id >= m_queue_count) return 0; return (m_queues[queue_id])->size();} template<typename t="">bool Pandc<t>::C(/*out*/T &ret){ DWORD wait_ret = WaitForMultipleObjects(m_queue_count,m_semaphores,false,INFINITE); if (WAIT_FAILED == wait_ret) return false; size_t i = wait_ret - WAIT_OBJECT_0; EnterCriticalSection(m_queuelocks[i]); if (qtFIFO == m_queue_type) { ret = m_queues[i]->front(); m_queues[i]->pop_front(); } else { ret = m_queues[i]->back(); m_queues[i]->pop_back(); } LeaveCriticalSection(m_queuelocks[i]); InterlockedDecrement(&m_item_count); return true;} template<typename t="">void Pandc<t>::P( T obj ){ if (InterlockedIncrement(&m_queue_id) > 1024 * 1024) InterlockedExchange(&m_queue_id,0); size_t i = (m_queue_id % m_queue_count); EnterCriticalSection(m_queuelocks[i]); m_queues[i]->push_back(obj); ReleaseSemaphore(m_semaphores[i],1,NULL); LeaveCriticalSection(m_queuelocks[i]); InterlockedIncrement(&m_item_count);} template<typename t="">Pandc<t>::~Pandc(){ for(vector<deque<t> * >::iterator it = m_queues.begin(); it!=m_queues.end();++it) { delete (*it); } for(vector<rtl_critical_section*>::iterator it = m_queuelocks.begin(); it! =m_queuelocks.end();++it) { DeleteCriticalSection(*it); delete (*it); } for(size_t i = 0; i<m_queue_count; ++i)="" {="" closehandle(m_semaphores[i]);="" }="" template<typename="" t="">Pandc<t>::Pandc(unsigned long QUEUE_COUNT,QueueType QT){ m_queue_id = 0; m_queue_type = QT; m_queue_count = QUEUE_COUNT; m_item_count = 0; m_semaphores = (HANDLE*)malloc(sizeof(HANDLE)*QUEUE_COUNT); memset(m_semaphores,0,sizeof(HANDLE)*QUEUE_COUNT); for(size_t i = 0; i< m_queue_count; ++i) { deque<t> *q = new deque<t>; m_queues.push_back(q); RTL_CRITICAL_SECTION *lock = new RTL_CRITICAL_SECTION; InitializeCriticalSection(lock); m_queuelocks.push_back(lock); HANDLE sp = CreateSemaphoreA(NULL,0,LONG_MAX,""); m_semaphores[i] = sp; }} #endif
0 0
- 珍藏好料开源放送: windows平台一个高性能、通用型的C++生产者/消费者架构模板
- windows平台一个高性能、通用型的C++生产者/消费者架构模板
- 《Java高并发程序设计》学习 --5.4 高性能的生产者-消费者:无锁的实现
- 一个简单的C语言操作系统生产者消费者模型
- 一个简单的生产者消费者
- 高性能并发框架 Disruptor 介绍 实现生产者消费者模型
- 通用型C/C++程序性能测试Benchmark的简单实现
- 多线程同步中的生产者消费者问题 - windows 平台实现
- 一个简单的生产者/消费者例子
- 生产者消费者的一个面试问题
- windows下多线程(生产者消费者问题:3个生产者,一个消费者,4个缓冲区)
- 生产者-消费者 C的简单模拟
- 生产者消费者---C实现
- c 生产者与消费者
- 实现一个通用的生产者消费者队列(c语言版本)
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- vuejs 报错 Decimals with leading zeros are not allowed in strict mode
- 二叉搜索树的基本操作-04-树7 二叉搜索树的操作集 (30分)
- Android ScrollView Button的显示隐藏
- Android ViewPager 小圆点 + 无限循环 + 动态滑动
- php高版本不再使用mysql_connect()来连接数据库
- windows平台一个高性能、通用型的C++生产者/消费者架构模板
- Trie树
- 深入JVM分析spring-boot应用hibernate-validator NoClassDefFoundError
- effective STL 读书笔记——第三章:关联容器
- 基于双向链表的增删改查和排序(C++实现)
- [cv]generalized hough transform
- Validation of the application resource model has failed during application initialization.
- 【软件安装】win10系统安装Microsoft Visual Studio C++ 6.0 (完整绿色版)使用说明
- TensorFlow 资源大全中文版