#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);
}else
return(false);
}
/* 取出 */
bool Pop( T &Result )
{
/* 判断是否为空 */
if ( Push_Count != Pop_Count )
{
Result = List[Pop_Count & Max_Mask];
__sync_synchronize();
Pop_Count++;
return(true);
} else
return(false);
}
private:
/* 变量 */
T List[Max_Count];
/*
* 如果一个基本变量被volatile修饰,编译器将不会把它保存到寄存器中,
* 是每一次都去访问内存中实际保存该变量的位置上。这一点就避免了
* 没有volatile修饰的变量在多线程的读写中所产生的由于编译器优化所导致的灾难性问题。
*/
volatile unsigned long Push_Count;
volatile unsigned long Pop_Count;
};
#endif /* _CREAD_WRITE_QUEUE_H_ */
单生产者单消费者循环无锁队列
最新推荐文章于 2025-06-03 16:35:44 发布