最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++線程安全的隊列你了解嘛

 更新時間:2022年03月10日 10:31:46   作者:吃米飯  
這篇文章主要為大家詳細介紹了C++線程安全的隊列,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

在這里插入圖片描述

無界隊列

#include<queue>
#include<mutex>
#include<condition_variable>
#include<optional>
#include<cassert>
#include<thread>
template<typename T,typename Container = std::queue<T>>
class Queue	//無界隊列
{
public:
	Queue() = default;
	~Queue() = default;
	//禁止拷貝和移動,編譯器會自動delete
	/*Queue(const Queue&) = delete;
	Queue(Queue&&) = delete;
	Queue& operator=(const Queue&) = delete;
	Queue& operator=(Queue&&) = delete;*/
	void push(const T& val)
	{
		emplace(val);
	}
	void push(T&& val)
	{
		emplace(std::move(val));
	}
	template<typename...Args>
	void emplace(Args&&...args)
	{
		std::lock_guard lk{ mtx_ };
		q_.push(std::forward<Args>(args)...);
		cv_.notify_one();
	}
	T pop()//阻塞
	{
		std::unique_lock lk{ mtx_ };
		cv_.wait(lk, [this] {return !q_.empty(); });//如果隊列不為空就繼續(xù)執(zhí)行,否則阻塞
		assert(!q_.empty());
		T ret{ std::move_if_noexcept(q_.front()) };
		q_.pop();
		return ret;
	}
	std::optional<T> try_pop()//非阻塞
	{
		std::unique_lock lk{ mtx_ };
		if (q_.empty())return {};
		std::optional<T> ret{ std::move_if_noexcept(q_.front()) };
		q_.pop();
		return ret;
	}
	bool empty()const
	{
		std::lock_guard lk{ mtx_ };
		return q_.empty();
	}
private:
	Container q_;
	mutable std::mutex mtx_;
	std::condition_variable cv_;
};
#include<iostream>
int main()
{
	Queue<int>q;
	std::thread t1(
		[&] {
			for (int i = 0; i < 100; ++i)
			{
				q.push(i);
			}
		});
	std::thread t2(
		[&] {
			for (int i = 0; i < 100; ++i)
			{
				//std::cout<<q.pop()<<" ";
				if (auto ret = q.try_pop())
				{
					std::cout << *ret<<" ";
				}
			}
		});
	t1.join();
	t2.join();
	return 0;
}

有界隊列

#include<mutex>
#include<condition_variable>
#include<boost/circular_buffer.hpp>
#include<optional>
template<typename T>
class Queue
{
public:
	Queue(size_t capacity) :q_{ capacity }{}
	template<typename T>
	void push(T&& val)//阻塞
	{
		std::unique_lock lk{ mtx_ };
		not_full_.wait(lk, [this] {return !q_.full(); });
		assert(!q_.full());
		q_.push_back(std::move(std::forward<T>(val)));
		not_empty_.notify_one();
	}
	template<typename T>
	bool try_push(T&& val)//非阻塞
	{
		std::lock_guard lk{ mtx_ };
		if (q_.full())return false;
		q_.push_back(std::forward<T>(val));
		not_empty_.notify_one();
		return true;
	}
	T pop()//阻塞
	{
		std::unique_lock lk{ mtx_ };
		not_empty_.wait(lk, [this] {return !q_.empty(); });
		asert(!q_.empty());
		T ret{ std::move_if_noexcept(q_.front()) };
		q_.pop_front();
		not_full_.notify_one();
		return ret;
	}
	std::optional<T> try_pop()//非阻塞
	{
		std::lock_guard lk{ mtx_ };
		if (q_.empty())return {};
		std::optional<T> ret{ std::move_if_noexcept(q_.front()) };
		q_.pop_front();
		not_full_.notify_one();
		return ret;
	}
private:
	boost::circular_buffer<T>q_;
	std::mutex mtx_;
	std::condition_variable not_full_;
	std::condition_variable not_empty_;
};
#include<iostream>
int main()
{
	Queue<int>q(10);
	std::thread t1(
		[&] {
			for (int i = 0; i < 100; ++i)
			{
				q.push(i);
			}
		});
	std::thread t2(
		[&] {
			for (int i = 0; i < 100; ++i)
			{
				//std::cout<<q.pop()<<" ";
				if (auto ret = q.try_pop())
				{
					std::cout << *ret << " ";
				}
			}
		});
	t1.join();
	t2.join();
	return 0;
}

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容! 

相關文章

  • C/C++實現字符串模糊匹配

    C/C++實現字符串模糊匹配

    本文分別給大家介紹了2個C++在Linux平臺和windows平臺下實現字符串模糊匹配的方法,基本的核心思想都是一樣的,均是使用fnmatch函數,有需要的小伙伴可以參考下。
    2016-04-04
  • C語言實現選票統計

    C語言實現選票統計

    這篇文章主要為大家詳細介紹了C語言實現選票統計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 基于C語言實現簡單的掃雷小游戲

    基于C語言實現簡單的掃雷小游戲

    這篇文章主要為大家詳細介紹了基于C語言實現簡單的掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Qt5升級到Qt6分步遷移教程小結

    Qt5升級到Qt6分步遷移教程小結

    Qt框架的一個新的長期支持版本6.5最近發(fā)布,本文主要介紹了Qt5升級到Qt6分步遷移教程小結,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 深入聊聊C語言中的Const關鍵字

    深入聊聊C語言中的Const關鍵字

    關鍵字const用來定義只讀變量,被const定義的變量它的值是不允許改變的,即不允許給它重新賦值,即使是賦相同的值也不可以,下面這篇文章主要給大家介紹了關于C語言中Const關鍵字的相關資料,需要的朋友可以參考下
    2022-02-02
  • C語言數組a和&a的區(qū)別講解

    C語言數組a和&a的區(qū)別講解

    今天小編就為大家分享一篇關于C語言數組a和&a的區(qū)別講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C++ 內存分配處理函數set_new_handler的使用

    C++ 內存分配處理函數set_new_handler的使用

    這篇文章主要介紹了C++ 內存分配處理函數set_new_handler的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C++不使用變量求字符串長度strlen函數的實現方法

    C++不使用變量求字符串長度strlen函數的實現方法

    這篇文章主要介紹了C++不使用變量求字符串長度strlen函數的實現方法,實例分析了strlen函數的實現原理與不使用變量求字符串長度的實現技巧,需要的朋友可以參考下
    2015-06-06
  • C++中拷貝構造函數的使用

    C++中拷貝構造函數的使用

    大家好,本篇文章主要講的是C++中拷貝構造函數的使用,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C++基礎入門教程(五):new和delete

    C++基礎入門教程(五):new和delete

    這篇文章主要介紹了C++基礎入門教程(五):new和delete,本文講解了動態(tài)分配內存、new和delete的配對、new、delete與reatin、release的關系、動態(tài)數組等內容,需要的朋友可以參考下
    2014-11-11

最新評論

呼图壁县| 布尔津县| 内乡县| 夹江县| 武强县| 同仁县| 青河县| 新平| 大姚县| 沙田区| 永城市| 新乐市| 锦屏县| 郑州市| 峡江县| 大同县| 宜城市| 铅山县| 汉中市| 云南省| 惠州市| 肥东县| 灌云县| 渝北区| 星座| 宁陵县| 申扎县| 鹤岗市| 三门峡市| 芮城县| 长泰县| 长顺县| 庆城县| 睢宁县| 新乡市| 吴桥县| 吉林市| 嵊泗县| 仪征市| 江山市| 克东县|