1 單生產者單消費者無鎖隊列
Github項目地址:https://github.com/cameron314/readerwriterqueue
1.1 成員函數說明
- try_enqueue:如果隊列中有空間,則使元素的副本入隊。如果元素已入隊,則返回true,否則返回false。不分配內存。
- enqueue : 使元素的副本進入隊列。如果需要,分配一個額外的內存塊。僅在內存分配失敗時失敗(返回false)。
- try_dequeue : 嘗試使元素出隊; 如果隊列爲空,返回false。 如果隊列中至少有一個元素,使用operator =將結果移到結果的前面,然後返回true。
- peek : 返回一個指向隊列中前元素的指針(接下來將通過調用
try_dequeue
或pop
刪除)。 如果
調用該方法時,隊列顯示爲空,返回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