生活随笔
收集整理的這篇文章主要介紹了
c++阻塞队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于C++11的阻塞隊列簡單實現
? ? ?轉載請說明出處:http://blog.csdn.net/cywosp/article/details/9157379
? ? ?在多線程編程中阻塞隊列(Blocking Queue)是一種常用于實現生產者和消費者模型的數據結構。其與普通的隊列區別在于,當隊列為空時,從隊列獲取元素的操作將會被阻塞,直到隊列中被放入了元素;當隊列滿時,往隊列里存放元素的操作也會被阻塞,直到有元素被從隊列中取出(以上的操作都是基于不同的線程來說的,線程在對阻塞隊列進程操作時會被阻塞)。下圖展示如何通過阻塞隊列來合作:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
接下來我們用C++11來實現一個簡單的阻塞隊列(沒有容量限制的BlockingQueue)
[cpp]?view plaincopy
template<typename?T>?? class?BlockingQueue?? {?? public:?? ????BlockingQueue?()?:?_mutex?(),?_condvar?(),?_queue?()?? ????{?? ?? ????}?? ?? ????void?Put?(const?T&?task)?? ????{?? ????????{?? ????????????std::lock_guard<std::mutex>?lock?(_mutex);?? ????????????_queue.push_back?(task);?? ????????}?? ????????_condvar.notify_all?();?? ????}?? ?? ????T?Take?()?? ????{?? ????????std::unique_lock<std::mutex>?lock?(_mutex);?? ????????_condvar.wait?(lock,?[this]{return?!_queue.empty?();});?? ????????assert?(!_queue.empty?());?? ????????T?front?(_queue.front?());?? ????????_queue.pop_front?();?? ?? ????????return?front;?? ????}?? ?? ????size_t?Size()?const?? ????{?? ????????std::lock_guard<std::mutex>?lock?(_mutex);?? ????????return?_queue.size();?? ????}?? ?? private:?? ????BlockingQueue?(const?BlockingQueue&?rhs);?? ????BlockingQueue&?operator?=?(const?BlockingQueue&?rhs);?? ?? private:?? ????mutable?std::mutex?_mutex;?? ????std::condition_variable?_condvar;?? ????std::list<T>?_queue;?? };??
注:以上代碼需要加入下列頭文件
#include <condition_variable> #include <list> #include <assert.h>
編譯時需要加入編譯選項 -std=c++0x或者-std=c++11
簡單測試程序如下:
將上述代碼放到?BlockingQueue.hpp文件中
[cpp]?view plaincopy
#include?<iostream>?? #include?<thread>?? #include?<future>?? #include?"BlockingQueue.hpp"?? ?? int?main?(int?argc,?char*?argv[])?? {?? ????BlockingQueue<int>?q;?? ????auto?t1?=?std::async?(std::launch::async,?[&q]?()?{?? ????????for?(int?i?=?0;?i?<?10;?++i)?{?? ????????????q.Put?(i);?? ????????}?? ????});?? ?? ????auto?t2?=?std::async?(std::launch::async,?[&q]?()?{?? ????????while?(q.Size?())?{?? ????????????std::cout?<<?q.Take?()?<<?std::endl;?? ????????}?? ????});?? ?? ????auto?t3?=?std::async?(std::launch::async,?[&q]?()?{?? ????????while?(q.Size?())?{?? ????????????std::cout?<<?q.Take?()?<<?std::endl;?? ????????}?? ????});?? ?? ????t1.wait?();?? ????t2.wait?();?? ????t3.wait?();?? ?? ????return?0;?? }?? 編譯:?g++ -o blockingqueue -std=c++11 main.cpp BlockingQueue.hpp -pthread 執行blockingqueue得如下結果: 10
23 4 5 6 7 8 9 本篇文章只是簡單的實現了阻塞隊列的插入函數與獲取函數,在java中有線程的BlockingQueue容器可以直接使用,其提供了很多有用的函數(欲知請Google)。
總結
以上是生活随笔為你收集整理的c++阻塞队列的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。