实现一个固定长度的同步队列

本文介绍了如何使用C++创建一个线程安全的固定长度同步队列,支持阻塞和非阻塞添加/获取元素以及获取队列当前元素数量。通过互斥锁和条件变量确保操作的并发安全。
摘要由CSDN通过智能技术生成

实现一个固定长度的同步队列,支持以下功能:

1、向队列中添加元素,包括阻塞和非阻塞两种接口;

2、从队列中获取元素,包括阻塞和非阻塞两种接口;

3、获取队列当前元素个数

此外需要保证:

1、接口线程安全;

2、队列可被正确释放;

#include <iostream>
#include <memory> 
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;

template <typename T, size_t Capacity>
struct SyncQueue {
public:

	SyncQueue() {};

	~SyncQueue() {
		unique_lock<std::mutex> lock(mutex);
		cv.wait(lock, [this]() { return queue.empty(); });
	}

	// 阻塞添加元素
	void addqueue(const T& item) {
		unique_lock<std::mutex> lock(mutex);
		while (queue.size() >= Capacity) {
			cv.wait(lock);
		}
		queue.push(item);
		cv.notify_one();
	}

	// 非阻塞添加元素
	bool tryaddqueue(const T& item) {
		lock_guard<std::mutex> lock(mutex);
		if (queue.size() >= Capacity) {
			return false; // 队列已满
		}
		queue.push(item);
		return true;
	}

	// 阻塞获取元素
	T dequeue() {
		unique_lock<std::mutex> lock(mutex);
		while (queue.empty()) {
			cv.wait(lock);
		}
		T item = queue.front();
		queue.pop();
		cv.notify_one();
		return item;
	}

	// 非阻塞获取元素
	bool trydequeue(T& item) {
		lock_guard<std::mutex> lock(mutex);
		if (queue.empty()) {
			return false; // 队列为空
		}
		item = queue.front();
		queue.pop();
		return true;
	}

	// 获取队列中元素的数量
	size_t size() const {
		lock_guard<std::mutex> lock(mutex);
		return queue.size();
	}

private:
	//私有定义互斥锁、条件变量、同步队列
	mutable mutex mutex; 
	condition_variable cv; 
	queue<T> queue; 
};

int main() {
	SyncQueue<int, 10> queue;

	// 模拟生产者
	thread producer([&queue]() {
		for (int i = 0; i < 100; ++i) {
			queue.addqueue(i);
			std::cout << "Produced-->: " << i << std::endl;
		}
	});

	// 模拟消费者
	thread consumer([&queue]() {
		for (int i = 0; i < 100; ++i) {
			int item = queue.dequeue();
			std::cout << "Consumed-->: " << item << std::endl;
		}
	});

	producer.join();
	consumer.join();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值