双线程读写无锁队列
2015-10-16 23:17
274 查看
#pragma once #ifndef __INCLUDE__CIRCLE__QUEUEUE__ #define __INCLUDE__CIRCLE__QUEUEUE__ #include<Windows.h> const long MAX_LEN = 10000; template<typename T> class CCircleQueue { public : CCircleQueue(); BOOL InitQueue(int lQueueLen); void UnInitQueue(); void Clear(); BOOL PushQueue(T *pNode); BOOL PopQueue(T* & pNode); private: long m_lRPos; long m_lWPos; long m_lQueueLen; T **m_pQueue;/****************************/ BOOL m_bInit;//看是否调用InitQueue函数 /****************************/ }; //////////////////////////////////////////////////////////////////////////// template<typename T> CCircleQueue<T>::CCircleQueue():m_lQueueLen(0),m_lRPos(0),m_lWPos(0),m_pQueue(NULL),m_bInit(FALSE) { } template<typename T> BOOL CCircleQueue<T>::InitQueue(int lQueueLen) { UnInitQueue(); if(lQueueLen > MAX_LEN) { return FALSE; } m_lQueueLen = lQueueLen + 1; m_pQueue = new T * [m_lQueueLen]; /****************************/ //初始化指针赋空 for(int i=0;i<m_lQueueLen;i++) { m_pQueue[i] = NULL; } /****************************/ m_bInit = TRUE; return TRUE; } template<typename T> void CCircleQueue<T>::UnInitQueue() { /****************************/ /****************************/ if(m_pQueue) { for(int i=0;i<m_lQueueLen;i++) { if(m_pQueue[i]) { delete m_pQueue[i]; m_pQueue[i] = NULL; } } delete m_pQueue; m_pQueue = NULL; } m_lQueueLen = 0; m_lWPos = m_lRPos; m_bInit = FALSE; } template<typename T> void CCircleQueue<T>::Clear() { if(m_bInit == FALSE) { return ; } for(int i=0;i<m_lQueueLen;i++) { if(m_pQueue[i]) { delete m_pQueue[i]; m_pQueue[i] = NULL; } } } template<typename T> BOOL CCircleQueue<T>::PushQueue(T *pNode) { if(m_bInit == FALSE) { return FALSE; } long lNext = (m_lWPos + 1) % m_lQueueLen; if(lNext == m_lRPos) { return FALSE; } else { //先放后移动 m_pQueue[m_lWPos] = pNode; m_lWPos = lNext; } return TRUE; } template<typename T> BOOL CCircleQueue<T>::PopQueue(T*& pNode) { if(m_bInit == FALSE) { return FALSE; } if(m_lRPos == m_lWPos) { return FALSE; } else { //先取后移动 pNode = m_pQueue[m_lRPos]; /****************************/ m_pQueue[m_lRPos] = NULL;//清空m_pQueue[m_lRPos]这个地方的野指针,否则在调用Clear //时m_pQueue[m_lRPose]有东西,再次删除崩了,这个地方在main函数已经删除了 /****************************/ m_lRPos = (m_lRPos + 1)% m_lQueueLen; } return TRUE; } #endif //__INCLUDE__CIRCLE__QUEUEUE__ #include<iostream> #include"Control.h" #include"Circle_Queue.h" #include"MyDao.h" using namespace std; class CTest { private: int a; public : CTest(int m_a):a(m_a) { } void Print() { cout<<a<<endl; } }; int main() { CCircleQueue<CTest>queue; if(queue.InitQueue(100) == FALSE) { cout<<"Init queue fail"<<endl; return -1; } CTest *p=NULL; for(int i=0;i<102;i++) { p = new CTest (i); if (FALSE == queue.PushQueue(p)) { cout<<i<<endl; delete p ; cout<<"queue full!"<<endl; } } for(int i=0;i<101;i++) { if (TRUE == queue.PopQueue(p)) { p->Print(); } else { delete p; cout<<"queue empty!"<<endl; break; } } queue.Clear(); queue.UnInitQueue(); system("pause"); return 0; }
相关文章推荐
- Oracle 管理中需要用到的命令
- 九度OJ 1026:又一版 A+B (进制转换)
- 九度OJ 1026:又一版 A+B (进制转换)
- 栈的应用
- 【C语言】顺序表,数组
- 平衡二叉树
- Oracle SQL 调优健康检查脚本
- 平衡二叉树
- 山城之旅
- 山城之旅
- ndk在真机调试
- android中加载的html获取的宽高不正确
- react-native初探
- Struts2环境搭建
- 九度OJ 1025:最大报销额 (01背包、DP)
- mac下安装nginx+php+mysql+xdebug
- 九度OJ 1025:最大报销额 (01背包、DP)
- 桶排序的简易形式
- 变量与魔术方法
- vsftpd server 搭建