2014-11-05 5 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을보고 있지만 어떤 데이터 구조가 목표를 달성 할 수 있는지 확실하지 않습니다. 의사는 실제로 일부 데이터 구조에 대해 복잡성이 없습니다.

의견을 보내 주시면 감사하겠습니다. C++ 11

+0

귀하의 플랫폼은 무엇입니까? 창문이라면 PPL을 탐색 할 수 있습니다 (http://msdn.microsoft.com/en-us/library/dd504906.aspx). – Jagannath

+0

당신이 해결하려고하는 진짜 문제가 여기에 있는지 물어야합니다. 그런 잠금 장치가없는 컨테이너를 발견하고 전략적으로 정상 세트에서 잠금 장치를 사용하는 것보다 속도가 느려질 수 있습니다. –

+0

'ConcurrentSkipListSet'에 lock-free가 있습니까? –

답변

1

, 그것은 쓰기 꽤 쉽게 자신의 :

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 
}; 

(11) C++없이, 너무 boost::mutex을있다.

+3

동시 발생. 자물쇠가 없습니까? 이제는 중요한 비트이고 위의 코드에서 볼 수 있듯이 std :: unique_lock 은 ... 잠금입니다. 잠금없는 데이터 구조의 핵심은 잠금을 방지하는 것입니다. 예, 저는 토트 로테이션 클럽 (Tautology Club)의 자랑스러운 멤버입니다. – George

+0

분명히 그 부분을 놓쳤습니다. – Barry

+1

어쨌든 고마워요. 도와 주셔서 감사합니다. – Fenwick