一种基于copy-on-write的多生产者消费者模型

本文介绍了一个消费即创建的设计模式,该模式使用智能指针、互斥锁和队列来实现线程安全的数据生产和消费。通过将生产和消费分离,并在消费前进行数据转移,有效地降低了锁的粒度。

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

#ifndef _CREATEONCOSUME
#define _CREATEONCOSUME
#include <vector>
#include <memory>
#include <mutex>
#include <queue>
using namespace std;

template<typename T>
class CreateOnConsume {
public:
	CreateOnConsume()
		: m_forProduce(make_shared<vector<T> >()) {};
	virtual void consumeEachVec(vector<T> &vec) = 0;
	void push(T &t) {
		lock_guard<mutex> lock(m_mtx);
		m_forProduce->push_back(t);
	};
	void consumeAll() {
		move2ForConsume();
		while (!m_forConsume.empty()) {
			auto &head = m_forConsume.front();
			consumeEachVec(*head);
			m_forConsume.pop();
		}
	};
	
protected:
	shared_ptr<vector<T> > m_forProduce;
	mutex m_mtx;
	queue<shared_ptr<vector<T> > > m_forConsume;//?
	void move2ForConsume() {
		lock_guard<mutex> lock(m_mtx);
		if (!m_forProduce->empty()) {
			m_forConsume.push(m_forProduce);
			m_forProduce = make_shared<vector<T> >();
		}
	};
};
#endif

子类只需要重载consumeEachVec即可。

生产过程的锁粒度很低,只是往std::vector push。

消费过程的锁只在move2ForCosume中作用。第一步判断生产用的vector是否为空,第二步搬运这个vector指针,第三步给生产者再创建一个vector。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值