Thread safe C++ std::set that supports add, remove and iterators from multple threads

ant*_*nte 2 c++ multithreading std set thread-safety

我正在寻找类似于 Java 中的 CopyOnWriteSet 的东西,一个支持 的集合addremove以及iterators来自多个线程的某种类型。

Ric*_*ick 5

没有我所知道的,最接近的是线程构建块,它具有 concurrent_unordered_map

只要您不进行并发修改,STL 容器就允许从多个线程进行并发读取访问。通常在添加/删除时不需要迭代。

关于提供一个简单的包装类的指导是合理的,我将从下面的代码片段开始,保护您真正需要并发访问的方法,然后提供对基本 std::set 的“不安全”访问,以便人们可以选择加入其他不安全的方法。如有必要,您还可以保护访问以获取迭代器并将它们放回原处,但这很棘手(仍然不如编写自己的无锁集或您自己的完全同步集)。

我在并行模式库上工作,所以我使用 VS2010 beta boost::mutex 中的 critical_section 也很好用,无论您选择如何执行此操作,几乎都需要使用 lock_guard 的 RAII 模式:

template <class T>
class synchronized_set
{
    //boost::mutex is good here too
    critical_section cs;
public:
    typedef set<T> std_set_type;
    set<T> unsafe_set;
    bool try_insert(...)
    {
        //boost has a lock_guard
        lock_guard<critical_section> guard(cs);
    }
};
Run Code Online (Sandbox Code Playgroud)