Ela*_*iss 9 c++ multithreading std c++11
我有一个多线程应用程序和共享资源std::map<KeyType, ElementType>
.我使用互斥锁来保护插入,获取和删除.
我的get方法返回对存储元素的引用(返回时解锁),然后我用该元素做一些工作.
问题:在处理存储的元素引用时,是否可能更改另一个线程,std::map
因此元素将被移动到不同的地址,并且引用将不再有效?(我知道某些ADT实现会在调整大小时重新安排ADT).
关联容器的迭代器失效规则(即std::map
)在[associative.reqmts]/9中说明:
insert和emplace成员不应影响迭代器的有效性和对容器的引用,并且擦除成员应仅使迭代器和对擦除元素的引用无效.
因此,如果一个线程插入一个元素,它将不会影响对现有元素的任何引用.但如果它删除了某些东西,其他线程可能会被堵塞.我会说,某种形式的元素锁定是有序的.