1. 程式人生 > >珍藏好料開源放送: windows平臺一個高效能、通用型的C++生產者/消費者架構模板

珍藏好料開源放送: 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/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

相關推薦

珍藏開源 windows平臺一個高效能通用C++生產者/消費者架構模板

/* 生產者/消費者通用模板 特點: 高效能:採用多執行緒,多佇列平衡的訊號量等待模型,有效減少鎖等待 可調節:可以根據實際應用環境調整佇列數,最多可支援64個佇列 使用簡單,一個建構函式,一個生產函式,一個消費函式。 */ #ifndef PANDC_H #define

10月國慶大python最新最全視訊電子書資料限時限量免費贈送

在分享資料之前 我先來介紹一下Python語言的特點 簡單 Python是一門簡單而文字簡約的語言。閱讀好的Python程式感覺就像閱讀英語,儘管是非常嚴格的英語。Python的這種虛擬碼特性是其最大強項之一,它可讓你專注於解決問題的辦法而不是語言本身。 容易學習 正如你即將看到的,

V4L2視訊採集與H.264編碼原始碼大Linux視訊採集與編碼(三)

這幾天的努力也算沒有白費,現在我將貢獻出我的成果,當然程式碼很大一部分都不是我寫的。 V4L2視訊採集我參考了V4L2官方原始碼,H.264編碼我使用了開源編碼庫x264,並參考了網上的一些例子。 但

財路網每日原創推如何鑑別一個區塊鏈專案的真假?

自從比特幣的巨大“賺錢效應”以及“暴漲暴跌”被各大媒體廣泛報道後,很多人躍躍欲試,也想搭上區塊鏈的快車,從中分一杯羹。但一打聽,得到的建議,或許是“比特幣已經漲了那麼多,以後的漲幅不會太大,還不如買其他幣,以後的漲幅會更可觀”。 於是,一部分人聽信了,買了一堆亂七八糟的幣種,全部是“空氣

推薦|23個Python爬蟲開源專案程式碼爬取微信淘寶豆瓣知乎微博等

今天為大家整理了23個Python爬蟲專案。整理的原因是,爬蟲入門簡單快速,也非常適合新入門的小夥伴培養信心。所有連結指向GitHub,祝大家玩的愉快 1、WechatSogou [1]– 微信公眾號爬蟲。 基於搜狗微信搜尋的微信公眾號爬蟲介面,可以擴充套件成基於搜狗搜尋的爬

Windows平臺上下載安裝和測試nodejs

Node是一個伺服器端 JavaScript 直譯器,它可以幫助程式設計師構建高度可伸縮的應用程式,編寫能夠處理數萬條同時連線到一個(只有一個)物理機的連線程式碼。下面就來介紹如何在Windows平臺上下載、安裝nodejs。 一、下載nodejs檔案  1.  2.進入

如何打造一個高效能高併發的訊息推系統

前言 女友常常勉勵我:“要有共享、開放、開源的現代網際網路思維,自己的經驗要多總結,發到部落格論壇上什麼的。”之前也有腦洞開啟,想分享一些個人在工作之中、工作之外的所思所得,可始終不能持久。這次想把本次參與開發的專案記錄、分享出來,希望能持之以恆。 part 1 即時通訊與訊息推送

[介面管理平臺] eoLinker AMS 專業版 V3.5 加入資料結構管理通用函式管理API 快速測試等近 30 項更新

eoLinker AMS是集API文件管理、API自動化測試、開發協作三位一體的綜合API開發管理平臺,是中國最大的線上API管理平臺。目前eoLinker AMS已經為來自全球的超過兩萬家企業託管超過一百萬的API,我們感謝每個曾經以及正在支援我們的企業以及開發者朋友,並對你們致以最誠摯的

windows平臺一個程式究竟佔用多少記憶體?

http://blog.csdn.net/jaminwm/article/details/1394993 首先宣告:         Virtual memory 和 memory swapping的概念對於UNIX等系統是兩個界限很明顯的概念,但是對於window

【崗位】華為開源軟體能力中心招賢納士,歡迎自薦或推薦

2015/2016最熱門話題莫過於Docker / Kubernetes / Mesos這類容器技術。華為早在2014年已經參與Docker社群開發,作為Founding member推動Linux基金會成立CNCF基金會(Cloud Native Computing Foundation)和OCI基金會(

技術年貨美團技術沙龍合輯大——85個演講,70+小時視訊

你好,2019 再見,2018 又到了一年辭舊迎新的時候,大家應該也和美美一樣,在忙著總結回顧和展望規劃吧。 按老慣例,我們該獻上技術年貨了。今年首先出場的,是我們的技術沙龍大套餐! 美團技術沙龍是由美團技術團隊和美團科協主辦的線下技術活動,每期沙龍邀請美團和同行公司的技術專家分享來

AWS 匯入事例 朝日株式會社

アマゾン ウェブ サービスでは人材を募集中です。 アマゾン ウェブ サービス(AWS)は、ダイナミックに成長している Amazon.com のビジネス部門の 1 つです。現在、ソフトウェア開発エンジニア、プロダクトマネージャー、アカウントマネージャー、ソリューションアーキテク

面試乾貨——年底乾貨大,你準備了嗎?

前言:年底了,騷年們有沒有很雞凍——年終獎有盼頭了。之前在介紹事件的這篇 C#基礎系列——再也不用擔心面試官問我“事件”了 也聊到了面試,引起了很多園友的共鳴。在不久的年後,熱門的跳槽季就要來了,如果你準備換工作,本篇或多或少能幫到你;如果你不打算換,沒關係,看看也無妨,看看是否有那麼幾道題能夠引起你的一點點

2018年度重磅福利20G人工智慧學習資料大

 小編說 首先小編代表人工智慧愛好者俱樂部全體工作人員祝大家元宵節快樂!晚上別忘了吃元宵或者湯圓

資訊系統專案管理師考試之歷年真題資源大(附帶個人珍藏論文)

本人2013年5月份通過了專案管理師的考試,軟考在即,現將本人備考期間的資料免費總送給大家,真題為參加的輔導班內部資料,有詳細的參考答案,另外本人備考期間寫的幾篇論文也已經放在了本人部落格上,奉獻給各位考生。友情提示:論文只可參考,不可抄襲,否則後果自負。另外本人有考試的時

Java開源知識庫XWiki安裝(Windows平臺

準備安裝XWiki,看了一下有三種安裝方式: XWiki is a Java-based wiki and runs on a Servlet Container such as Tomcat, Jetty, JBoss, WebLogic, WebSphere, et

不會開發的你也能管理企業漏洞,開源免費工具洞察(insight II)

## 前言 公司剛開始建設安全管理時,都是從一片混沌開始的,資源總是不夠的,我們每個做安全的人員,又要會滲透,又要抓制度,還得管理各種漏洞。在管理樓棟是,我相信大家都遇到過以下幾個問題: 1. 漏洞提交太多,自己用表格管理不過來了 2. 每個漏洞進度不同,自己忙著忙著可能就忘記記錄各個漏洞的進度 3. 漏洞進

IC卡解密從零開始學1 (也許會有2) 解密工具V2 V3大 By:lookyour

中國 tac ... 需要 編輯框 回復 mile gui for 前段時間發了一個破解的PN532工具,詳見 ===========================IC卡解密工具 PN532工具XP 爆破版http://www.52pojie.cn/thread-5978

Windows Phone 7 設計簡介

target 其他 最新 選項卡 metro 操作 fuse 郵件 好的 英文原文:smashingmagazine   導讀:Windows Phone 7 引進了一個全新的內容管理和用戶界面,命名為Metro的設計語言和理論。微軟這次所看準的市場和用戶群也與之前的老一

開源軟件NoSql數據庫 - 圖數據庫 Cassandra

避免 更多 創建 負載平衡 這就是 重復 9.png tar 客戶 轉載自原文地址:http://www.cnblogs.com/loveis715/p/5299495.html Cassandra簡介   在前面的一篇文章《圖形數據庫Neo4J簡介》中,我們介紹