gpt4 book ai didi

c++ - 迭代器有效性和线程

转载 作者:行者123 更新时间:2023-11-30 02:06:08 24 4
gpt4 key购买 nike

假设我在 C++11 程序的主线程中构建了一个 std::set,用项目填充它并从中提取一个迭代器 it .之后,我从另一个线程开始修改集合,使元素只能添加到其中而不能删除。

it 的有效性是否在集合被修改时也得到保证,或者我是否应该认为 it 在集合被另一个线程的插入操作修改时无效?

最佳答案

来自第 23.2.1 节 [container.requirements.general]:

Unless otherwise specified (either explicitly or by defining a function in terms of other functions), invoking a container member function or passing a container as an argument to a library function shall not invalidate iterators to, or change the values of, objects within that container.

对于诸如 std::set 的关联容器,第 23.2.4 节([associative.reqmts])说:

The insert and emplace members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.

因此您的迭代器在插入其他项目后将保持有效。

然而,线程安全是完全不同的话题。

第 17.6.5.9 节([res.on.data.races])规定

Operations on iterators obtained by calling a standard library container or string member function may access the underlying container, but shall not modify it.

由于这会导致在更新容器时读取容器,在从另一个线程插入集合时使用 std::set 迭代器不一定安全 .您的实现可能会提供更有力的保证。

关于c++ - 迭代器有效性和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9006663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com