日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++阻塞队列

發布時間:2024/8/23 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++阻塞队列的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。