我有一个关于 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/