日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

windows平台一个高性能、通用型的C++生产者/消费者架构模板

發布時間:2025/3/21 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows平台一个高性能、通用型的C++生产者/消费者架构模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/* 生產者/消費者通用模板 特點: 高性能:采用多線程,多隊列平衡的信號量等待模型,有效減少鎖等待 可調節:可以根據實際應用環境調整隊列數,最多可支持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/FILOvolatile 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

總結

以上是生活随笔為你收集整理的windows平台一个高性能、通用型的C++生产者/消费者架构模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。