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

All*_*nzi 4 c++ multithreading std c++11

在此Stack Overflow答案中,列出了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只要这些元素不是在第一个线程中插入和擦除的元素,就会查找(使用)元素,并确保重复没有发生?

如果没有,这些规则究竟意味着什么?

Bor*_*der 6

容器元素的迭代器未被无效的事实决不会暗示容器本身的线程安全性.例如,size成员变量需要原子地修改,这与迭代器在插入/删除时无效(或不是)无关.

TL;博士; 没有.

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