线程安全通用缓冲区队列类

// 通用库
namespace Common
{
	namespace Thread
	{
		// 线程安全通用缓冲区队列
		template <typename Type>
		class CThreadBuffer
		{
		public:
			CThreadBuffer()
			{
				pthread_mutex_init(&m_lock, NULL);
				pthread_cond_init(&m_notEmpty, NULL);
				pthread_cond_init(&m_notFull, NULL);
				m_iReadPos = 0;
				m_iWritePos = 0;
			}

			~CThreadBuffer()
			{
				pthread_mutex_destroy(&m_lock);
				pthread_cond_destroy(&m_notEmpty);
				pthread_cond_destroy(&m_notFull);
			}

		public:
			// 入队
			void Push(const Type& data)
			{
				pthread_mutex_lock(&m_lock);

				// 等待缓冲区未满
				if ((m_iWritePos + 1) % BUFF_SIZE == m_iReadPos)
				{
					pthread_cond_wait(&m_notFull, &m_lock);
				}

				// 写数据,并移动指针
				m_buffer[m_iWritePos] = data;
				m_iWritePos++;

				if (m_iWritePos >= BUFF_SIZE)
				{
					m_iWritePos = 0;
				}

				// 设置缓冲区非空的条件变量
				pthread_cond_signal(&m_notEmpty);
				pthread_mutex_unlock(&m_lock);
			}

			// 出队
			void Pop(Type& data)
			{
				pthread_mutex_lock(&m_lock);

				// 等待缓冲区非空
				if (m_iWritePos == m_iReadPos)
				{
					pthread_cond_wait(&m_notEmpty, &m_lock);
				}

				// 读数据,移动读指针
				data = m_buffer[m_iReadPos];
				m_iReadPos++;

				if (m_iReadPos >= BUFF_SIZE)
				{
					m_iReadPos = 0;
				}

				// 设置缓冲区未满的条件变量
				pthread_cond_signal(&m_notFull);
				pthread_mutex_unlock(&m_lock);
			}

		private:
			static const int BUFF_SIZE = 32;
			Type m_buffer[BUFF_SIZE];
			int m_iReadPos;
			int m_iWritePos;
			pthread_mutex_t m_lock;
			pthread_cond_t m_notEmpty;
			pthread_cond_t m_notFull;
		};
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值