再谈多线程模型之生产者消费者(总结)(c++11实现)

0.关于

为缩短篇幅,本系列记录如下:
再谈多线程模型之生产者消费者(基础概念)(c++11实现)
再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)
再谈多线程模型之生产者消费者(单一生产者和多消费者)(c++11实现)
再谈多线程模型之生产者消费者(多生产者和单一消费者 )(c++11实现)
再谈多线程模型之生产者消费者(多生产者和多消费者 )(c++11实现)
再谈多线程模型之生产者消费者(总结)(c++11实现)本文

本文涉及到的代码演示环境: VS2017

欢迎留言指正

1. 关于结构体模型

回到一对多或者多对多的结构体模型中来看。这里以多对多为例。

template<typename T>
struct repo_
{
	// 用作互斥访问缓冲区
	std::mutex				_mtx_queue;

	// 缓冲区最大size
	unsigned int			_count_max_queue_10 = 10;

	// 缓冲区
	std::queue<T>			_queue;

	// 缓冲区没有满,通知生产者继续生产
	std::condition_variable _cv_queue_not_full;

	// 缓冲区不为空,通知消费者继续消费
	std::condition_variable _cv_queue_not_empty;



	// 用于生产者之间的竞争
	std::mutex				_mtx_pro;
	// 计算当前已经生产了多少数据了
	unsigned int			_cnt_cur_pro = 0;


	// 用于消费者之间的竞争
	std::mutex				_mtx_con;
	// 计算当前已经消费多少数据了
	unsigned int			_cnt_cur_con = 0;


	repo_(const unsigned int count_max_queue = 10) :_count_max_queue_10(count_max_queue)
		, _cnt_cur_con(0)

	{
		;
	}

	repo_(const repo_&instance) = delete;
	repo_& operator = (const repo_& instance) = delete;
	repo_(const repo_&&instance) = delete;
	repo_& operator = (const repo_&& instance) = delete;

};

其实,你肯定也发现了,结构体中的_cnt_cur_pro_cnt_cur_con用作控制线程的结束。 实际中结束线程的方式有多种多样, 而且实际中线程很少会出现线程仅运行几次就退出了。

2.互斥与同步

这4类模型中,其实,只需要分析清楚,哪些对象之间存在互斥,哪些对象之间存在同步即可。只是模型有好几种,理解好单一生产者单一消费者模型,后面的3种都非常容易了。

3. 多缓冲区与单一缓冲区

你肯定也发现了,这几篇笔记中,主要都是在单一缓冲区上做文章,那,多缓冲区呢?由于经常使用到的是笔记中记下的模型,多缓冲区模型还没用到过,自己还没掌握。 欢迎留言交流多缓冲区。

posted @ 2020-10-21 14:44  mohist  阅读(560)  评论(0编辑  收藏  举报