這個是一個用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 秒c++
//代碼及測試例子下載:緩存