无锁队列的原理与实现
2017-04-19 21:28
176 查看
近期几天在思考无锁队列。看了相关文章,也读了一些博客,最后写了一份代码,代码实现对在多线程环境下对队列的读和写是不须要加锁的。
代码例如以下所看到的:
代码例如以下所看到的:
#include <windows.h> #pragma comment(lib, "Kernel32.lib") template<typename VT> class LcFQue{//lock free queue public: struct QueNode{ QueNode *next; VT value; }; public: LcFQue(); ~LcFQue(); public: void EnQue(const VT& val); VT DeQue(); private: QueNode *tail; QueNode *head; }; template<typename VT> LcFQue<VT>::LcFQue(){ tail= head= new QueNode; tail->value= -1; tail->next= NULL; } template<typename VT> LcFQue<VT>::~LcFQue(){ QueNode* DelNode= head; while(DelNode!= tail){ head= head->next; delete DelNode; DelNode= head; } delete DelNode; } template<typename VT> void LcFQue<VT>::EnQue(const VT& val){ QueNode* node = new QueNode; node->next = NULL; node->value = val; QueNode* tTail; do{ tTail= tail; }while(InterlockedCompareExchange((LONG*)&(tTail->next),(LONG)node,NULL)!= NULL); InterlockedCompareExchange((LONG*)(&tail),(LONG)node,(LONG)tTail); } template<typename VT> VT LcFQue<VT>::DeQue(){ QueNode* tHead; do{ tHead= head; if(tHead->next==NULL){ return -1; } }while(InterlockedCompareExchange((LONG*)(&head),(LONG)(head->next),(LONG)tHead)!= (LONG)tHead); return tHead->next->value; } #include <stdlib.h> #include <string.h> #include <iostream> #include <ctime> #include <cstdlib> using namespace std; LcFQue<int> que; int C[1000]; DWORD WINAPI EnQue(void* ParAddr); DWORD WINAPI Deque(void* ParAddr); int main(){ memset(C,0,sizeof(C)); srand(time(NULL)); HANDLE hThread[10]; int AddEd[10]; for(int i= 0; i< 10; ++i){ AddEd[i]= i; } LPTHREAD_START_ROUTINE func; for(int i= 0; i< 10; ++i){ if(i> 5){ func= Deque; }else{ func= EnQue; } hThread[i]= ::CreateThread( NULL, 0, func, AddEd+i, 0, NULL ); } ::WaitForMultipleObjects(10,hThread,TRUE,INFINITE); } DWORD WINAPI Deque(void* ParAddr){ while(true){ ::Sleep(10); int val= que.DeQue(); if(val==-1){ continue; } cout<<val<<'\n'; ++C[val]; } return 0; } DWORD WINAPI EnQue(void* ParAddr){ int* obj= (int*)ParAddr; for(int i= 0; i< 100; ++i){ que.EnQue(i*5+*obj); ::Sleep(rand()%10); } return 0; }
相关文章推荐
- 简要分析Ogre渲染队列的实现原理
- 简要分析Ogre渲染队列的实现原理(转)
- 浅谈java阻塞队列实现原理
- 简要分析OGRE渲染队列的实现原理(二)
- 简要分析ogre渲染队列的实现原理(一)
- 简要分析Ogre渲染队列的实现原理(一)
- 索引优先队列-IndexedPrirotyQueue的原理及实现(源码)
- 简要分析Ogre的渲染队列实现原理
- Java并发包中的同步队列SynchronousQueue实现原理
- 简要分析Ogre的渲染队列实现原理(二)
- 简要分析Ogre渲染队列的实现原理
- 简要分析Ogre渲染队列的实现原理
- [转]简要分析Ogre的渲染队列实现原理(二)
- Java Thread&Concurrency(14): 深入理解条件队列(Condition)及其实现原理
- 环形队列实现原理 /链式实现
- 简要分析Ogre渲染队列的实现原理(一)
- [转]简要分析Ogre渲染队列的实现原理(一)
- Java并发包中的同步队列SynchronousQueue实现原理
- jquery源码解析:jQuery队列操作queue方法实现的原理
- 线性结构(三) - 队列的原理与实现