C++实现循环阻塞队列CycleBlockingQueue

本文介绍了一种基于C++实现的循环阻塞队列(CycleBlockingQueue),该队列采用生产者消费者模式,利用vector数组进行缓冲管理,预分配size+1的空间。文章详细展示了队列的源码实现,包括push和pop操作的线程同步处理。

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

C++实现循环阻塞队列CycleBlockingQueue

描述

1)循环阻塞队列采用生产者消费者模式;
2)循环阻塞队列内部采用了vector数组(也可使用链表)管理缓冲,并预先分配size+1的空间;
3)关于与之前博客中的线程池连用,需要扩展相应的函数接口;

源码

CycleBlockingQueue.h

#pragma once
#include<vector>
#include<mutex>
#include<condition_variable>

template<typename T>
class CycleBlockingQueue {
private:
	std::vector<T>buffer;
	int size;
	int front = { 0 };
	int rear = { 0 };

	std::mutex mx;
	std::condition_variable p_cond;
	std::condition_variable c_cond;

	bool isEmpty() {
		return front == rear;
	}
	bool isFull() {
		return (rear + 1) % size == front;
	}

public:
	CycleBlockingQueue(int bs) :
		buffer(bs + 1), size(bs + 1) {

	}

	void push(T& val) {
		std::unique_lock<std::mutex> lock(mx);
		p_cond.wait(lock, [&]() {return !isFull(); });
		buffer[rear] = val;
		rear = (rear + 1) % size;
		c_cond.notify_one();
	}

	T pop() {
		std::unique_lock<std::mutex> lock(mx);
		c_cond.wait(lock, [&]() {return !isEmpty(); });
		T val = buffer[front];
		front = (front + 1) % size;
		p_cond.notify_one();
		return val;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值