单生产者单消费者循环无锁队列

来源:互联网 发布:淘宝纪效新书 编辑:程序博客网 时间:2024/04/28 13:18
#ifndef _CREAD_WRITE_QUEUE_H_#define _CREAD_WRITE_QUEUE_H_/* 队列尺寸 */#define DEFAULT_QUEUE_SIZE 12   /* Max_Count=4096 *//* Size最大30   ,默认为12 */template<typename T, unsigned int Size> class CRead_Write_Queue{public:enum{Max_Count= 1 << Size,    /* 注:Max_Count 必须为 2 的指数,即:2, 4, 8, 16...) */Max_Mask=Max_Count - 1  /* = Max_Count - 1 */};CRead_Write_Queue(){Push_Count= 0;Pop_Count= 0;};~CRead_Write_Queue(){};public:/* 加入 */bool Push( T AData ){if ( Push_Count - Pop_Count < Max_Count ){List[Push_Count & Max_Mask] = AData;__sync_synchronize();Push_Count++;return(true);}elsereturn(false);}/* 取出 */bool Pop( T &Result ){/* 判断是否为空 */if ( Push_Count != Pop_Count ){Result = List[Pop_Count & Max_Mask];__sync_synchronize();Pop_Count++;return(true);}       elsereturn(false);}private:/* 变量 */T List[Max_Count];/* * 如果一个基本变量被volatile修饰,编译器将不会把它保存到寄存器中, * 是每一次都去访问内存中实际保存该变量的位置上。这一点就避免了 * 没有volatile修饰的变量在多线程的读写中所产生的由于编译器优化所导致的灾难性问题。 */volatile unsigned longPush_Count;volatile unsigned longPop_Count;};#endif /* _CREAD_WRITE_QUEUE_H_ */


原创粉丝点击