gpt4 book ai didi

c++ - 迭代器失效规则是否意味着线程安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:01 31 4
gpt4 key购买 nike

Here in this Stack Overflow answer它列出了 C++11 中标准容器的迭代器失效规则。特别是插入:

  1. [multi]{set,map}:所有迭代器和引用不受影响 [23.2.4/9]
  2. unordered_[multi]{set,map}:所有迭代器在重新哈希发生时失效,但引用不受影响 [23.2.5/8]。如果插入不会导致容器的大小超过 z * B,则不会发生重新散列,其中 z 是最大负载因子,B 是当前的桶的数量。 [23.2.5/14]

    删除:

  3. [multi]{set,map}unordered_[multi]{set,map}:只有对被删除元素的迭代器和引用无效

这些规则是否意味着我可以在一个线程中安全地进行插入和删除,并在另一个线程中安全地访问、查找(使用 find)元素,只要这些元素不是被插入的元素并在第一个线程中删除,并确保没有发生重新散列?

如果不是,这些规则的确切含义是什么?

最佳答案

容器元素的迭代器不会失效这一事实绝不意味着容器本身的线程安全。例如,size 成员变量需要以原子方式修改,这与迭代器在插入/删除时无效(或不无效)完全不同。

tl;博士;没有。

这些规则只是告诉您元素的迭代器何时因操作而失效。例如,当 vector 调整大小时,底层数组会重新分配到别处,因此如果您有一个指向元素的迭代器(或指针),它在调整大小后将不再有效(因为它将指向旧数组的已删除元素).

关于c++ - 迭代器失效规则是否意味着线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32017363/

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