假设在C ++ 11程序的主线程中我构建了一个std::set
,用项填充它并从中提取迭代器it
。之后,从另一个线程开始,我开始修改集合,使元素只能添加到它而不会被删除。
在修改集合时是否确保it
的有效性,或者在通过其他线程的插入操作修改集合时是否应该认为it
无效?
答案 0 :(得分:4)
从第23.2.1节[container.requirements.general]
:
除非另有说明(显式或通过根据其他函数定义函数),调用容器成员函数或将容器作为参数传递给库函数不应使迭代器无效或更改对象的值在那个容器内。
对于std::set
等关联容器,第23.2.4节([associative.reqmts]
)说:
insert
和emplace
成员不应该影响迭代器和容器引用的有效性,erase
成员只能使迭代器和对擦除元素的引用无效。
因此,插入其他项目后,您的迭代器将保持有效。
然而,线程安全完全是一个不同的主题。
第17.6.5.9节([res.on.data.races]
)规定
通过调用标准库容器或字符串成员函数获得的迭代器上的操作可以访问底层容器,但不得修改它。
由于这会导致在更新容器时读取容器,从另一个线程插入集合时使用std::set
迭代器不一定安全。您的实施可能会提供更有力的保障。