一個高效能無鎖非阻塞連結串列佇列
這個是一個用c++ 11標準實現的無鎖非阻塞連結串列佇列,透過增加一個dummy節點,解偶合連結串列頭指標和尾指標。使得當只有一個生產者和一個消費者時,進隊和出隊都無需加鎖,進隊操作的是尾指標,出隊操作的是頭指標,互不干涉。對於多個生產者且單個消費者時,只需要對尾指標加鎖保護,而頭指標不需要加鎖。反之,對於單生產者且多消費者時,只需要對頭指標加鎖保護而尾指標不需要加鎖。如果是多生產者和多消費者,那麼頭尾指標各自加鎖保護。同時,佇列內部會對節點進行快取,避免重複的記憶體分配以提高效能。
在雙cpu的機器上測試,效能比boost實現的單生產者和單消費者佇列boost::lockfree::spsc_queue快6到7倍。
//對模板使用別名,方便使用(說明:NullMutex是一個空鎖,是一個自旋鎖spin_lock)
//單生產者和單消費者
template<typename VALUE_TYPE> using spsc_queue = TDoubleLockLinkedNonBlockingQueue<VALUE_TYPE, NullMutex, NullMutex>;
//多生產者和單消費者
template<typename VALUE_TYPE> using mpsc_queue = TDoubleLockLinkedNonBlockingQueue<VALUE_TYPE, spin_lock, NullMutex>;
//單生產者和多消費者
template<typename VALUE_TYPE> using spmc_queue = TDoubleLockLinkedNonBlockingQueue<VALUE_TYPE, NullMutex,spin_lock>;
//多生產者和多消費者
template<typename VALUE_TYPE> using mpmc_queue = TDoubleLockLinkedNonBlockingQueue<VALUE_TYPE, spin_lock, spin_lock>;
//使用例子:
//定義一個單生產者和單消費者佇列
spsc_queue<int> queue;
//進隊
queue.push(1);
//出隊
int value;
if(queue.pop(value))
{
printf("value = %d \n",value);
}
下文測試例子在E5-2620 v3 雙cpu的機器上的執行結果:
////////////////////////////////////////////////////////////////////////////
單生產者[1]--單消費者[1]模型測試 資料請求[count=100000000]:
NullMutex TDoubleLockLinkedNonBlockingQueue : 花時 3.010000 秒
boost::lockfree::spsc_queue : 花時 19.312000 秒
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557424/viewspace-2218788/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 自定義單連結串列佇列的基本介面函式(非迴圈佇列)佇列函式
- 佇列_單向連結串列佇列
- 連結串列&鏈棧&佇列佇列
- 阻塞佇列一——java中的阻塞佇列佇列Java
- 鏈式佇列—用連結串列來實現佇列佇列
- 高效能無鎖佇列 Disruptor 初體驗佇列
- 聊聊陣列與連結串列,棧與佇列陣列佇列
- 佇列、阻塞佇列佇列
- 用連結串列實現佇列的功能佇列
- 連結串列-雙向非通用連結串列
- 你應該知道的高效能無鎖佇列Disruptor佇列
- 怎樣實現一個非阻塞的超時重試任務佇列佇列
- 線性表(陣列、連結串列、佇列、棧)詳細總結陣列佇列
- Java中常用七個阻塞佇列的總結Java佇列
- 自己動手實現一個阻塞佇列佇列
- 認識無鎖佇列佇列
- 連結串列、棧、佇列、KMP相關知識點佇列KMP
- 連結串列還會用嗎?用連結串列實現佇列(附演算法原始碼)佇列演算法原始碼
- 阻塞佇列 BlockingQueue佇列BloC
- 阻塞佇列--LinkedBlockingQueue佇列BloC
- 《啊哈!演算法》-第 2 章:棧、佇列、連結串列演算法佇列
- 資料結構與演算法(二)佇列、棧、連結串列資料結構演算法佇列
- 單執行緒-非阻塞-長連結執行緒
- 非阻塞佇列ConcurrentLinkedQueue與CAS演算法應用分析佇列演算法
- java實現單連結串列、棧、佇列三種資料結構Java佇列資料結構
- 死磕阻塞佇列佇列
- 陣列與連結串列陣列
- 陣列和連結串列陣列
- 請判斷一個連結串列是否為迴文連結串列。
- 重溫四大基礎資料結構:陣列、連結串列、佇列和棧資料結構陣列佇列
- 重學資料結構和演算法(一)之複雜度、陣列、連結串列、棧、佇列、圖資料結構演算法複雜度陣列佇列
- 反轉一個單連結串列。
- 延遲阻塞佇列 DelayQueue佇列
- 阻塞佇列BlockingQueue(三)--DelayQueue佇列BloC
- Java中的阻塞佇列Java佇列
- 阻塞佇列——四組API佇列API
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- (一)連結串列