c++ 实现的BlockingQueue
2012-10-16 17:39
495 查看
1、BlockingQueue类
2、CCodition类
Condition.h
Condition.cpp
3、CLock类
Lock.h
Lock.cpp
4、CCritical类
Critical.h
Critical.cpp
#include "thread/Critical.h" #include "thread/Codition.h" #include "thread/Lock.h" #include <vector> using namespace std; const unsigned int DEFAULT_MAX_SIZE = 100; template<class T> class BlockingQueue { public: BlockingQueue(unsigned int uMaxSize = DEFAULT_MAX_SIZE); ~BlockingQueue(void); public: bool Add( T item); bool Put( T item); T Take();//获取不到数据,一直阻塞 bool Poll(unsigned long time, T& item);//time单位ms,time时间内获取不到队列数据,返回NULL private: vector<T> m_vecQueue; CCodition m_oGetCondition; CCodition m_oSetCondition; CCritical m_oCriticalSection; unsigned int m_uMaxSize; }; template<class T> BlockingQueue<T>::BlockingQueue( unsigned int uMaxSize ) :m_uMaxSize(uMaxSize) { } template<class T> BlockingQueue<T>::~BlockingQueue( void ) { m_vecQueue.clear(); } template<class T> bool BlockingQueue<T>::Add( T item ) { CLock oLock(&m_oCriticalSection); if (m_vecQueue.size() < m_uMaxSize) { m_vecQueue.push_back(item); m_oGetCondition.Signal(); return true; } return false; } template<class T> bool BlockingQueue<T>::Put( T item ) { CLock oLock(&m_oCriticalSection); while (true) { if (m_vecQueue.size() < m_uMaxSize) { m_vecQueue.push_back(item); m_oGetCondition.Signal(); return true; } if (WAIT_FAILED == m_oSetCondition.Wait(INFINITE)) { return false; } } } template<class T> bool BlockingQueue<T>::Poll( unsigned long time, T& item ) { while (true) { if (!m_vecQueue.empty()) { CLock oLock(&m_oCriticalSection); vector<T>::iterator it = m_vecQueue.begin(); item = *it; m_vecQueue.erase(it); m_oSetCondition.Signal(); return true; } DWORD dwWaitResult = m_oGetCondition.Wait(time); if (WAIT_TIMEOUT == dwWaitResult || WAIT_FAILED == dwWaitResult) { return false; } } } template<class T> T BlockingQueue<T>::Take() { while (true) { if (!m_vecQueue.empty()) { CLock oLock(&m_oCriticalSection); vector<T>::iterator it = m_vecQueue.begin(); T item = *it; m_vecQueue.erase(it); m_oSetCondition.Signal(); return item; } m_oGetCondition.Wait(); } }
2、CCodition类
Condition.h
#include <Windows.h> class CCodition { public: CCodition(void); ~CCodition(void); public: void Signal();//发送信号 DWORD Wait(unsigned long time = INFINITE);//等待信号 private: HANDLE m_hSignalEvent; };
Condition.cpp
#include "StdAfx.h" #include "Codition.h" CCodition::CCodition(void) { m_hSignalEvent = ::CreateEvent(NULL, false, false, NULL); } CCodition::~CCodition(void) { if (NULL != m_hSignalEvent) { ::CloseHandle(m_hSignalEvent); } } void CCodition::Signal() { if (NULL == m_hSignalEvent) { return; } ::SetEvent(m_hSignalEvent); } DWORD CCodition::Wait(unsigned long time) { if (NULL == m_hSignalEvent) { return WAIT_FAILED; } return ::WaitForSingleObject(m_hSignalEvent, time); }
3、CLock类
Lock.h
#include "Critical.h" class CLock { public: CLock(CCritical* pCritical); ~CLock(void); private: CLock(void); private: CCritical* m_pCritical; };
Lock.cpp
#include "StdAfx.h" #include "Lock.h" CLock::CLock(void) { } CLock::CLock( CCritical* pCritical ) { if (NULL != pCritical) { m_pCritical = pCritical; m_pCritical->Lock(); } } CLock::~CLock(void) { if (NULL != m_pCritical) { m_pCritical->Unlock(); } }
4、CCritical类
Critical.h
#include <Windows.h> class CCritical { public: CCritical(void); ~CCritical(void); public: void Lock(); void Unlock(); private: CRITICAL_SECTION m_oCriticalSection; };
Critical.cpp
#include "StdAfx.h" #include "Critical.h" CCritical::CCritical(void) { ::InitializeCriticalSection(&m_oCriticalSection); } CCritical::~CCritical(void) { ::DeleteCriticalSection(&m_oCriticalSection); } void CCritical::Lock() { ::EnterCriticalSection(&m_oCriticalSection); } void CCritical::Unlock() { ::LeaveCriticalSection(&m_oCriticalSection); }
相关文章推荐
- 一个C++的BlockingQueue实现
- C++ 归并排序实现(算法导论)
- 设计模式C++实现(1)——工厂模式
- 数据结构笔记之用C++实现顺序栈和链式栈
- 数据结构-栈:顺序栈与链栈的C++模板类实现
- MD5算法(C++实现)
- 用C++实现,输入一个日期,输出它是一年中的第几天。
- 算法导论-第32章-字符串匹配:Knuth-Morris-Pratt(KMP)算法C++实现
- 设计模式C++实现——组合模式
- C++实现——小孩分糖果问题
- 设计模式的解析和实现(C++)之-Prototype模式
- 0-1背包问题与完全背包问题C++实现 动态规划
- 【面试题精选】1-构造一个二叉查找树-C++实现
- 双链表基本操作C++实现
- c++ 中的slipt实现
- C++对象模型之RTTI的实现原理
- 工厂方法模式C++实现
- c++实现栈简单功能小程
- 在C++实现委托
- 数据结构-红黑树(Red-Black Tree)的C++实现模板