1. 程式人生 > >使用C++ 11 實現阻塞佇列

使用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;   &