C++11 - 基於無鎖隊列的單生產者單消費者模型

1 單生產者單消費者無鎖隊列

Github項目地址:https://github.com/cameron314/readerwriterqueue
在這裏插入圖片描述

1.1 成員函數說明

  • try_enqueue:如果隊列中有空間,則使元素的副本入隊。如果元素已入隊,則返回true,否則返回false。不分配內存。
  • enqueue : 使元素的副本進入隊列。如果需要,分配一個額外的內存塊。僅在內存分配失敗時失敗(返回false)。
  • try_dequeue : 嘗試使元素出隊; 如果隊列爲空,返回false。 如果隊列中至少有一個元素,使用operator =將結果移到結果的前面,然後返回true。
  • peek : 返回一個指向隊列中前元素的指針(接下來將通過調用try_dequeuepop刪除)。 如果
    調用該方法時,隊列顯示爲空,返回nullptr。必須僅從消費者線程調用。
  • pop : 從隊列中刪除前元素(如果有),而不返回它。成功返回true,如果隊列當時爲空則返回false。
  • size_approx :返回隊列中當前的大概項目數。從生產者線程和使用者線程都可以安全調用。
  • max_capacity : 返回此隊列爲空時可排隊但不分配的項目總數。 生產者線程和消費者線程均可安全調用。
  • emplace : 類似於enqueue(),但具有Emplace語義(就地構造)
  • try_emplace : 類似於try_enqueue(),但具有Emplace語義(就地構造)

1.2 使用

在項目中包含readerwriterqueue.h和atomicops.h

2 多生產者多消費者無鎖隊列

另外這個作者還搞了一個併發的無鎖隊列,
Github地址:https://github.com/cameron314/concurrentqueue
在這裏插入圖片描述

3 單生產者單消費者無鎖模型

基於第一個項目的readerwriterqueue,做了以下代碼測試:

#include <iostream>
#include <thread>

#include "readerwriterqueue.h"

using namespace moodycamel;


ReaderWriterQueue<int> q(100);

int globalCount = 0;
// 生產者線程
void Producer()
{
	while (true)
	{
		globalCount++;
		q.enqueue(globalCount);
	}
}

void Consumer()
{
	while (true)
	{
		int temp;
		q.try_dequeue(temp);
		std::cout <<temp << std::endl;
	}
}



int main()
{
	std::thread consumer_Thread(Consumer);
	std::thread producer_Thread(Producer);

	consumer_Thread.join();
	producer_Thread.join();

	getchar();
	return 0;
}

速度是真的快,果然如這個作者說的:最快的同步就是永不不會發生的同步。而且其壓出隊列的順序做出了保證。
在這裏插入圖片描述
如果有興趣,可以訪問我的個站:http://www.stubbornhuang.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章