使用C++ 11 實現阻塞佇列
#pragma once #include <condition_variable> #include <mutex> #include <deque> template<class T> class BlockQueue { public: typedef std::unique_lock<std::mutex> TLock; //maxCapacity為-1,代表隊列無最大限制 explicit BlockQueue(const int maxCapacity = -1):m_maxCapacity(maxCapacity) { } size_t size() { TLock lock(m_mutex); return m_list.size(); } void push_back(const T &item) { TLock lock(m_mutex); if (true == hasCapacity()) { while (m_list.size() >= m_maxCapacity) { m_notFull.wait(lock); } } m_list.push_back(item); m_notEmpty.notify_all(); } T pop() { TLock lock(m_mutex); while (m_list.empty()) { m_notEmpty.wait(lock); } T temp = *m_list.begin(); m_list.pop_front(); m_notFull.notify_all(); lock.unlock(); return temp; } bool empty() { TLock lock(m_mutex); return m_list.empty(); } bool full() { if (false == hasCapacity) { return false; } TLock lock(m_mutex); return m_list.size() >= m_maxCapacity; } private: bool hasCapacity() const { return m_maxCapacity > 0; } typedef std::deque<T> TList; TList m_list; const int m_maxCapacity; std::mutex m_mutex; std::condition_variable m_notEmpty; std::condition_variable m_notFull; };
測試程式碼
#include <iostream> #include <thread> #include <stdio.h> #include "BlockQueue.hpp" using namespace std; typedef BlockQueue<int> TQueue; void produce(TQueue &queue) { const int num = 9; for (int i = 0; i < num; ++i) { queue.push_back(i); } } void consume(TQueue &queue) { while (false==queue.empty()) { int tmp = queue.pop(); printf("%d\n", tmp); std::this_thread::sleep_for(chrono::seconds(1)); } } int main() { TQueue queue(2); std::thread t1(produce, std::ref(queue)); std::thread t2(consume, std::ref(queue)); std::thread t3(consume, std::ref(queue)); t3.join(); t2.join(); t1.join(); return 0; }
相關推薦
使用C++ 11 實現阻塞佇列
#pragma once #include <condition_variable> #include <mutex> #include <deque> template<class T> class BlockQueue { public: typedef
用C++11實現一個有界的阻塞隊列
ide true 多線程編程 from ces locker sid const read 對於一個無界的阻塞隊列而言,其實現非常簡單,即用一個鎖(鎖隊列)+ 一個條件變量(判空)即可。那麽對於一個有界阻塞隊列而言,其隊列的容量有上限,其實只要再加一個條件變量用來判斷是否滿
C++11 實現信號量Semaphore類
signed clas 可能 details 時有 art one http spa 1 #pragma once 2 #include <mutex> 3 #include <condition_variable> 4 class Sem
(Google面試題)有四個線程1、2、3、4同步寫入數據……C++11實現
blog image more http auto 最終 進行 .get fall 最近在學習多線程,題目源自 MoreWindows先生的 《秒殺多線程第一篇》(http://blog.csdn.net/morewindows/article/details/739274
C++11實現一個簡單的線程池
start art AI fun con var func iostream any 為了不讓手生,邊復習邊手擼了一個線程池,代碼量比較少,如下,用了一些C++11的實現,語言標準嘛,就是跨平臺的: thread_poo.h #ifndef _THREAD_POOL_ #
C++11實現生產者和消費者
#include <iostream> #include <thread> #include <mutex> #include <deque> #include <vector> #include <condition
java 併發包 Lock Condition實現阻塞佇列
import java.util.LinkedList; import java.util.List; import java.util.Random; import java.util.concurrent.locks.Condition; import java.util.concurrent.
C++11實現一個自動註冊的工廠
轉自:https://www.cnblogs.com/qicosmos/p/5090159.html 實現動機 工廠方法是最簡單地建立派生類物件的方法,也是很常用的,工廠方法內部使用switch-
C++11實現訊號量
由於C++11 和 Boost.Thread 都沒有提供訊號量,但是對於這個簡單的東西,有時候使用就是太簡單,但是為什麼沒有,可能他們覺得是這個東西太容易出錯了,所以自己實現也不是很複雜。 直接上程式碼: #include <condition_variable> #inc
基於C++11實現執行緒池的工作原理.
基於C++11實現執行緒池的工作原理. 文章目錄 基於C++11實現執行緒池的工作原理. 簡介 執行緒池的組成 1、執行緒池管理器 2、工作執行緒 3、任務介面, 4、任務佇列
C++11實現的定時器
分享一個基於C++11實現的定時器,當有多個定時任務時,向定時器裡面新增定時任務,定時器到時間自動執行事件,編譯環境(GCC) 4.7.2 ,參考程式碼 Timer.h #ifndef _X_TIMER_H #define _X_TIMER_H #include <map>
基於C++11實現執行緒池的工作原理
基於C++11實現執行緒池的工作原理. 不久前寫過一篇執行緒池,那時候剛用C++寫東西不久,很多C++標準庫裡面的東西沒怎麼用,今天基於C++11重新實現了一個執行緒池。 簡介 執行緒池(thread pool):一種執行緒的使用模式,執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池
利用C++11實現執行緒task的簡單封裝
#include <functional> #include <thread> #include <type_traits> /*Compile only if 'F' is callable. F maybe function, la
python實現阻塞佇列
怎麼實現阻塞佇列?當然是靠鎖,但是應該怎麼鎖?一把鎖能在not_empty,not_full,all_tasks_done三個條件之間共享。好比說,現在有執行緒A執行緒B,他們準備向佇列put任務,佇列的最大長度是5,執行緒A在put時,還沒完事,執行緒B就開始put,佇列就
併發程式設計(三): 使用C++11實現無鎖stack(lock-free stack)
C++11中CAS實現: template< class T> struct atomic { public: bool compare_exchange_weak( T& expected, T desired,
資料結構-C語言實現迴圈佇列
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 #define OK 1 #define OVERFLOW -1 typedef struct{ int *base;
C語言實現迴圈佇列的初始化&進隊&出隊&讀取隊頭元素&判空-2
/*順序表實現佇列的一系列操作(設定flag標誌不損失陣列空間)*/ #include<stdio.h> #include<stdlib.h> #define Queue_Size 50 //佇列的最大長度 #define OK 1 #define ER
C語言實現鏈佇列的初始化&進隊&出隊
/*連結串列實現佇列的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typedef struct node { int data;
C語言實現迴圈佇列的初始化&進隊&出隊&讀取隊頭元素&判空-1
目前,處在學習資料結構+ing,由於之前學過了佇列,今天就把自己寫過的程式碼做了一些完善分享給大家,希望能夠幫助到有需要的朋友,有不足的地方歡迎大家交流 φ(゜▽゜*)♪ 佇列是另一種限定性的線性表,它只允許在表的一端插入元素,而在另一端刪除元素,所以佇列
Java實現阻塞佇列的兩種方式
方式一:/** * 使用非阻塞佇列PriorityQueue及wait/notify方法實現一個阻塞佇列**/class MyBlockingQueue { public final static int queueSize = 10; &