我可以同时调用 std::unordered_map 的这些成员函数吗?

Can I call these member functions of std::unordered_map concurrently?

提问人:L. Sam 提问时间:10/26/2022 最后编辑:DailyLearnerL. Sam 更新时间:10/26/2022 访问量:81

问:

我有一个全球. 我还恰好有一个线程是 A 型线程,多个线程是 B 型并发运行。std::unordered_map<int, int> m

螺纹类型 A: 调用 ,添加/删除 m 的一些元素(保证不同时在线程类型 B 中读/写的元素)insert()erase()

螺纹类型 B: 调用 M,执行类似 .(保证线程类型 B 不会同时修改同一个元素,并且 key 已经存在)operator[]m[key] = valuem

在没有锁的情况下同时执行这些操作是否安全?

C++ 多线程 std 无序映射

评论

2赞 Evg 10/26/2022
执行插入可能会导致重新散列。仅此一项就表明它并不安全。
0赞 Artyer 10/26/2022
如果键都不同,为什么不能在线程 A 中有两个映射,并且对于所有线程?m_am_bB

答:

2赞 user253751 10/26/2022 #1

不。insert 可以重新散列数组,从而重新分配存储桶数组。如果这种情况发生在访问它之前,那就是免费后使用。operator[]

这可能不是它不安全的唯一原因,但我们只需要找到一个,证明它是不安全的。

2赞 Sam Varshavchik 10/26/2022 #2

不,这是不安全的。C++ 库中的 方法和任何其他容器都不是线程安全的。因此,如果一个执行线程正在修改容器,则必须正确同步所有执行线程对容器的所有访问。std::unordered_map

评论

0赞 Mark Ransom 10/26/2022
标准是否明确指出它们不是线程安全的,或者我们是否必须假设它们没有提到线程安全?
3赞 Evg 10/26/2022
这太强了。有一定的保证,例如“同一容器中的不同元素可以由不同的线程同时修改,但 的元素除外。std::vector<bool>
1赞 user253751 10/26/2022
在某些情况下,对容器的并发访问是安全的 - 大多数情况下,当没有线程修改容器本身,而只是修改其中的元素时。