2014-11-05 26 views
1

我正在尋找在C++中無鎖數據結構來替換以下:並行設置爲C + +?

pthread_mutex_lock(plock); 
set.insert(element); 
pthread_mutex_unlock(plock); 

此組應該最多O(logN)的複雜性支持.insert().size()用,有一個迭代器,並應該能夠通過自定義比較器保持其順序。基本上和Java中的ConcurrentSkipListSet一樣。理想情況下,它應該是平臺獨立的。

我在尋找CDS:http://libcds.sourceforge.net/doc/cds-api/modules.html,但不確定哪個數據結構可以實現目標。該文檔對於某些數據結構並不具有複雜性。

任何建議將是偉大的,謝謝!

+0

你的平臺是什麼?如果是Windows,您可以探索PPL(http://msdn.microsoft.com/en-us/library/dd504906.aspx)。 – Jagannath 2014-11-05 00:33:56

+0

我必須問你想要解決的真正問題在這裏?有可能你可以找到這樣一個無鎖容器......然後讓它變得比戰略上使用正常集合上的鎖更慢。 – 2014-11-05 01:52:53

+0

你確定'ConcurrentSkipListSet'是否是無鎖的? – 2014-11-05 02:32:17

回答

1

用C++ 11,這是很容易寫你自己:

template <typename T, typename Compare = std::less<T>> 
class concurrent_set 
{ 
private: 
    set::set<T, Compare> set_; 
    std::mutex mutex_; 

public: 
    typedef typename std::set<T, Compare>::iterator iterator; 
    // etc. 

    std::pair<iterator, bool> 
    insert(const T& val) { 
     std::unique_lock<std::mutex> lock(mutex_); 
     return set_.insert(val); 
    } 

    size_type size() const { 
     std::unique_lock<std::mutex> lock(mutex_); 
     return set_.size(); 
    } 
    // same idea with other functions 
}; 

沒有C++ 11,有boost::mutex了。

+3

可能併發。無鎖?現在這是重要的一點,正如你從上面的代碼中可以看到的那樣,std :: unique_lock 就是...一個鎖。一個無鎖數據結構的全部要點是爲了避免鎖定。是的,我是重言式俱樂部的驕傲成員。 – George 2014-11-05 01:34:42

+0

顯然錯過了那部分。 – Barry 2014-11-05 01:57:34

+1

無論如何,男士。我感謝您的幫助。 – Fenwick 2014-11-05 03:33:04