我正在寻找类似于 Java 中的 CopyOnWriteSet 的东西,一个支持 add
、remove
和某种类型的 iterators
的集合多个线程。
最佳答案
没有我所知道的,最接近的是线程构建 block ,它具有 concurrent_unordered_map
STL 容器允许 concurrent read access from multiple threads只要你不做并发修改。通常没有必要在添加/删除时进行迭代。
关于提供简单包装类的指南是明智的,我将从下面的代码片段开始,保护您真正需要并发访问的方法,然后提供对基本 std::set 的“不安全”访问,所以伙计们可以选择其他不安全的方法。如有必要,您还可以保护访问权限以获取迭代器并将它们放回原位,但这很棘手(仍然比编写您自己的无锁集或您自己的完全同步集更棘手)。
我在并行模式库上工作,所以我使用 VS2010 beta 中的 critical_section boost::mutex 也很好用,无论你如何选择,使用 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);
}
};
关于c++ - 支持多线程添加、删除和迭代器的线程安全 C++ std::set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1404717/