1

以下を置き換えるために、C++ でロックフリーのデータ構造を探しています。

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

セットは、最大で O(logN) の複雑さをサポート.insert().size()、イテレータを持ち、カスタム コンパレータで順序を維持できる必要があります。ConcurrentSkipListSet基本的に、Javaの と同じことを行います。理想的には、プラットフォームに依存しない必要があります。

CDS: http://libcds.sourceforge.net/doc/cds-api/modules.htmlを見ていますが、どのデータ構造が目標を達成できるかわかりません。ドキュメントには、一部のデータ構造について実際には複雑さがありません。

どんな提案も素晴らしいでしょう、ありがとう!

4

1 に答える 1

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ます。

于 2014-11-05T01:01:59.840 に答える