C++線程安全的隊(duì)列你了解嘛
無(wú)界隊(duì)列
#include<queue> #include<mutex> #include<condition_variable> #include<optional> #include<cassert> #include<thread> template<typename T,typename Container = std::queue<T>> class Queue //無(wú)界隊(duì)列 { public: Queue() = default; ~Queue() = default; //禁止拷貝和移動(dòng),編譯器會(huì)自動(dòng)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(); });//如果隊(duì)列不為空就繼續(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; }
有界隊(duì)列
#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; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用C++一步步實(shí)現(xiàn)俄羅斯方塊后續(xù)
本文主要給大家分享的是作者在使用C++制作俄羅斯方塊小游戲的時(shí)候所需要的常用的函數(shù),有需要的小伙伴可以借鑒下,希望大家能夠喜歡。2017-12-12利用C/C++二進(jìn)制讀寫(xiě)png文件的方法示例
最近在做項(xiàng)目的時(shí)候遇到了這個(gè)問(wèn)題,所以想著總結(jié)下,方法自己和有需要的朋友,下面這篇文章主要介紹了利用C/C++二進(jìn)制讀寫(xiě)png文件的方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2016-12-12C語(yǔ)言實(shí)現(xiàn)順序表的基本操作的示例詳解
順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ)。本文將通過(guò)示例為大家講解一下順序表的基本操作,需要的可以參考一下2022-11-11C++實(shí)現(xiàn)二叉樹(shù)基本操作詳解
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)二叉樹(shù)基本操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12C++實(shí)現(xiàn)LeetCode(38.計(jì)數(shù)和讀法)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(38.計(jì)數(shù)和讀法),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07深入理解大數(shù)與高精度數(shù)的處理問(wèn)題
本篇文章是對(duì)大數(shù)與高精度數(shù)的處理進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++示例分析內(nèi)聯(lián)函數(shù)與引用變量及函數(shù)重載的使用
為了消除函數(shù)調(diào)用的時(shí)空開(kāi)銷(xiāo),C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語(yǔ)言中的宏展開(kāi)。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)2022-08-08C語(yǔ)言宏函數(shù)container of()簡(jiǎn)介
這篇文章介紹了C語(yǔ)言宏函數(shù)container of(),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12