1. 程式人生 > 實用技巧 >再談多執行緒模型之生產者消費者(總結)(c++11實現)

再談多執行緒模型之生產者消費者(總結)(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. 多緩衝區與單一緩衝區

你肯定也發現了,這幾篇筆記中,主要都是在單一緩衝區上做文章,那,多緩衝區呢?由於經常使用到的是筆記中記下的模型,多緩衝區模型還沒用到過,自己還沒掌握。 歡迎留言交流多緩衝區。