可以对std :: map中的元素引用无效吗?

Ela*_*iss 9 c++ multithreading std c++11

我有一个多线程应用程序和共享资源std::map<KeyType, ElementType>.我使用互斥锁来保护插入,获取和删除.

我的get方法返回对存储元素的引用(返回时解锁),然后我用该元素做一些工作.

问题:在处理存储的元素引用时,是否可能更改另一个线程,std::map因此元素将被移动到不同的地址,并且引用将不再有效?(我知道某些ADT实现会在调整大小时重新安排ADT).

Sto*_*ica 8

关联容器的迭代器失效规则(即std::map)在[associative.reqmts]/9中说明:

insert和emplace成员不应影响迭代器的有效性和对容器的引用,并且擦除成员应仅使迭代器和对擦除元素的引用无效.

因此,如果一个线程插入一个元素,它将不会影响对现有元素的任何引用.但如果它删除了某些东西,其他线程可能会被堵塞.我会说,某种形式的元素锁定是有序的.