gpt4 book ai didi

c++ - std::map 线程安全

转载 作者:IT老高 更新时间:2023-10-28 21:51:46 29 4
gpt4 key购买 nike

对 std::map 中对象的引用是线程安全的吗?

std::map< std::string, Object >   _objects;

map 可以从许多线程中更改,并且此访问是同步的,但对值 (Object &) 的引用只能从 1 个实例和线程访问。如果另一个线程将项目添加到 map ,使用 Object & 进行写操作是否安全?会重新分配吗?

最佳答案

C++11 标准保证 const 方法对容器的访问对于不同线程是安全的(即,两者都使用 const 方法)。

此外,[container.requirements.dataraces] 状态

implementations are required to avoid data races when the contents of the contained object in different elements in the same sequence, excepting vector<bool>

换句话说,除了 vector<bool> 修改不同的内容不是数据竞争。

现在,如果一个线程使另一个线程使用的迭代器无效,显然这是一场数据竞争(并导致未定义的行为)。如果一个线程对容器进行非 const 访问,而另一个线程进行 const 访问,这就是数据竞争(和未定义的行为)。 (注意:出于多线程的目的,许多函数被“视为 const”,包括 beginend 和其他非 const 的函数(和方法),因为它们返回非 const 迭代器。[] 包含在这组出于线程安全原因,伪 const,除了 mapunordered_set 等 - 23.2.2.1)。

但是,如果您对容器中的某个元素有引用,并且在另一个线程中执行不会使该引用无效的操作,并且从未在另一个线程中写入该元素,则您可以安全地从中读取引用。同样,如果其他线程甚至从未读取过该元素,那么写入该元素不应导致未定义的行为。

对于标准引用,17.6.5.9.5 似乎保证标准库中的函数不会跑掉并不必要地读/写元素。

所以简短的回答:你是安全的,只要其他线程不直接与 map 中的特定条目混淆。

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

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