這個是乙個用c++ 11標準實現的無鎖非阻塞鍊錶佇列,通過增加乙個dummy節點,解偶合煉表頭指標和尾指標。使得當只有乙個生產者和乙個消費者時,進隊和出隊都無需加鎖,進隊操作的是尾指標,出隊操作的是頭指標,互不干涉。對於多個生產者且單個消費者時,只需要對尾指標加鎖保護,而頭指標不需要加鎖。反之,對於單生產者且多消費者時,只需要對頭指標加鎖保護而尾指標不需要加鎖。如果是多生產者和多消費者,那麼頭尾指標各自加鎖保護。同時,佇列內部會對節點進行快取,避免重複的記憶體分配以提高效能。
在雙cpu的機器上測試,效能比boost實現的單生產者和單消費者佇列boost::lockfree::spsc_queue快6到7倍。
//對模板使用別名,方便使用(說明:nullmutex是乙個空鎖,是乙個自旋鎖spin_lock)
//單生產者和單消費者
templateusing spsc_queue = tdoublelocklinkednonblockingqueue;
//多生產者和單消費者
templateusing mpsc_queue = tdoublelocklinkednonblockingqueue;
//單生產者和多消費者
templateusing spmc_queue = tdoublelocklinkednonblockingqueue;
//多生產者和多消費者
templateusing mpmc_queue = tdoublelocklinkednonblockingqueue;
//使用例子:
//定義乙個單生產者和單消費者佇列
spsc_queuequeue;
//進隊
queue.push(1);
//出隊
int value;
if(queue.pop(value))
下文測試例子在e5-2620 v3 雙cpu的機器上的執行結果:
單生產者[1]--單消費者[1]模型測試 資料請求[count=100000000]:
nullmutex tdoublelocklinkednonblockingqueue : 花時 3.010000 秒
boost::lockfree::spsc_queue : 花時 19.312000 秒
乙個可無限伸縮且無ABA問題的無鎖佇列
關於無鎖佇列,詳細的介紹請參考陳碩先生的 無鎖佇列的實現 一文。然進一步,如何實現乙個不限node數目即能夠無限伸縮的無鎖佇列,即是本文的要旨。無鎖佇列有兩種實現形式,分別是陣列與鍊錶。以陣列實現的無鎖佇列,限定了基本node的數目,然沒有aba問題。以鍊錶實現的無鎖佇列,在記憶體允許的情況下可以新...
乙個可無限伸縮且無ABA問題的無鎖佇列
關於無鎖佇列,詳細的介紹請參考陳碩先生的 無鎖佇列的實現 一文。然進一步,如何實現乙個不限node數目即能夠無限伸縮的無鎖佇列,即是本文的要旨。無鎖佇列有兩種實現形式,分別是陣列與鍊錶。以陣列實現的無鎖佇列,限定了基本node的數目,然沒有aba問題。以鍊錶實現的無鎖佇列,在記憶體允許的情況下可以新...
乙個可無限伸縮且無ABA問題的無鎖佇列
關於無鎖佇列,詳細的介紹請參考陳碩先生的 無鎖佇列的實現 一文。然進一步,如何實現乙個不限node數目即能夠無限伸縮的無鎖佇列,即是本文的要旨。無鎖佇列有兩種實現形式,分別是陣列與鍊錶。以陣列實現的無鎖佇列,限定了基本node的數目,然沒有aba問題。以鍊錶實現的無鎖佇列,在記憶體允許的情況下可以新...