乙個高效能無鎖非阻塞鍊錶佇列

2021-08-31 01:23:12 字數 1102 閱讀 7647

這個是乙個用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問題。以鍊錶實現的無鎖佇列,在記憶體允許的情況下可以新...