您当前的位置: 首页 >  windows

phymat.nico

暂无认证

  • 4浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

phymat.nico 发布时间:2017-05-10 01:13:33 ,浏览量:4

/*
生产者/消费者通用模板
特点:
高性能:采用多线程,多队列平衡的信号量等待模型,有效减少锁等待
可调节:可以根据实际应用环境调整队列数,最多可支持64个队列
使用简单,一个构造函数,一个生产函数,一个消费函数。
*/
#ifndef PANDC_H
#define PANDC_H
 
#include 
#include 
#include 
#include 
 
 
using namespace std;
 
enum QueueType
{
  qtFIFO,
  qtFILO
};
//T生产的对象
template
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 m_queues; //队列
  vector m_queuelocks;   //队列锁
  HANDLE *m_semaphores; //队列信号量
  unsigned long m_queue_count; //队列数
  QueueType m_queue_type; //进出队列方式 FIFO/FILO
  volatile LONG m_item_count; //队列中的总条目数
};
 
template
long Pandc::QueueItemCount( unsigned long queue_id )
{
  if (queue_id >= m_queue_count)
    return 0;
  return (m_queues[queue_id])->size();
}
 
template
bool Pandc::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
void Pandc::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
Pandc::~Pandc()
{
  for(vector::iterator it = m_queues.begin(); it!=m_queues.end();++it)
  { 
    delete (*it);    
  }
  for(vector::iterator it = m_queuelocks.begin(); it!
 
=m_queuelocks.end();++it)
  {
    DeleteCriticalSection(*it);
    delete (*it);
  }
  for(size_t i = 0; i            
关注
打赏
1659628745
查看更多评论
0.0922s