ant*_*nte 2 c++ multithreading std set thread-safety
我正在寻找类似于 Java 中的 CopyOnWriteSet 的东西,一个支持 的集合add,remove以及iterators来自多个线程的某种类型。
没有我所知道的,最接近的是线程构建块,它具有 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)