2014-11-05 27 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