一個高性能無鎖非阻塞鏈表隊列

 

這個是一個用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++

 

//代碼及測試例子下載:緩存

http://www.oschina.net/code/snippet_2504104_55974性能

相關文章
相關標籤/搜索