c++ - C++ std::set 线程安全吗?

标签 c++ stl std stdset

我有一个关于 std::set 线程安全的问题。

据我所知,我可以迭代一个集合并添加/删除成员,这不会使迭代器无效。

但请考虑以下情况:

  • 线程“A”迭代一组 shared_ptr
  • 线程“B”偶尔会向此集合添加项目。

我在程序运行时遇到了段错误,我不确定为什么会发生这种情况。是缺乏线程安全的原因吗?

最佳答案

STL 没有内置线程支持,因此您必须扩展 STL 使用您自己的同步机制的代码来使用 STL 多线程环境。

例如看这里:link text

由于 set 是一个容器类,MSDN 有以下关于容器线程安全的说法。

单个对象是线程安全的,可以从多个线程中读取。例如,给定一个对象 A,同时从线程 1 和线程 2 读取 A 是安全的。

如果一个线程正在写入单个对象,则必须保护在同一线程或其他线程上对该对象的所有读取和写入。例如,给定一个对象 A,如果线程 1 正在写入 A,则必须阻止线程 2 读取或写入 A。

即使另一个线程正在读取或写入同一类型的不同实例,读取和写入一个类型的实例也是安全的。例如,给定相同类型的对象 A 和 B,如果在线程 1 中写入 A 而在线程 2 中读取 B 是安全的。

关于c++ - C++ std::set 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1362110/

相关文章:

c++ - C++ 中的 switch 语句

c++ - 在 xcode 中编译 RTMidi

c++ - 尽管使用 EXTERN "C",但从 C++ 调用 C 函数时出现链接器错误

c++ - 如果我真的非常想从 STL 容器继承,并且我继承了构造函数并删除了 new 运算符,那会发生什么?

c++ - 使用 std::map 时无法捕获未处理的异常

C++ 没有运算符 ">>"匹配这些操作数(<string> 包含在 header 中)

C++ STL 容器 - 关于类型的一些问题?

c++ - std::sort by unary 映射

C++: "vector<int>::size_type variable"- 以这种方式声明有什么意义?

c++ - 如何实现类似std的迭代器的自定义实现?