c++ - 支持多线程添加、删除和迭代器的线程安全 C++ std::set

标签 c++ multithreading thread-safety set std

我正在寻找类似于 Java 中的 CopyOnWriteSet 的东西,一个支持 addremove 和某种类型的 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/

相关文章:

c++ - 在结构 vector 中查找元素

c++ - 在函数中修改动态二维数组

c# - 这段代码需要什么样的同步?

c# - Thread.Sleep 不工作!

c++ - pthreads 只创建一个线程

android - 使用 Qt Creator 为 Android 构建 Qt 应用程序时出错

c++ - 如何在C++类中正确使用复制构造函数和赋值

java - 多线程连接(长毫秒)操作

c++ - 多线程树数据结构的只读函数..我需要什么才能使线程安全

go - Go 中 t-digest 数据结构的线程安全实现?