在现有元素运行线程时插入到 std::map

问题描述 投票:0回答:1

给定一个包含成对的 std::string,A 的 std::map,其中 A 是一个对象,它生成并管理它自己的线程。 在地图中存在其他元素时插入地图是否存在危险? IE。他们正在管理自己的线程。 我担心的是插入更多元素会导致现有的 A 对象在内存中移动,从而对内部线程造成风险。是这样吗?

std::unordered_map 呢?

(问题不在于对地图本身的并发读/写访问)

c++ memory-management thread-safety resize stdmap
1个回答
0
投票

迂腐地,这完全取决于“生成并管理它自己的线程”的含义。如果不真正知道这是怎么回事,就不可能得到 100% 准确的答案。例如,如果一个对象的方法启动了一个分离的

std::thread
,并且新的执行线程没有引用启动它的对象,那么......没有人关心。执行线程不引用启动它的对象,它的命运可以听天由命。

但是,实际上,您显然是在暗示执行线程确实以某种形式或方式引用了它的起始对象,问题是该对象是否失效。

您可以通过一种非常简单的方法来回答您自己的问题:只需查找您感兴趣的任何容器的技术参考,然后查找容器中现有值的任何迭代器何时以及如何失效。这就是你的答案。

如果您要为您的

std::map
查找此内容,您会发现将新值插入地图不会使指向地图中其他值的任何迭代器失效。你的物品是安全的。

但对于

std::unordered_map
则不然。将新值插入无序映射可能会使所有现有迭代器失效。

© www.soinside.com 2019 - 2024. All rights reserved.