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

本文介绍了一个名为CRead_Write_Queue的通用类模板,该类用于实现支持多线程读写的环形队列。队列的最大长度由模板参数Size决定,并且必须是2的幂次。文章详细展示了如何通过Push和Pop方法进行元素的插入和移除操作,同时使用volatile关键字确保多线程环境下数据的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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_ */


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值