提问人:L. Sam 提问时间:10/26/2022 最后编辑:DailyLearnerL. Sam 更新时间:10/26/2022 访问量:81
我可以同时调用 std::unordered_map 的这些成员函数吗?
Can I call these member functions of std::unordered_map concurrently?
问:
我有一个全球.
我还恰好有一个线程是 A 型线程,多个线程是 B 型并发运行。std::unordered_map<int, int> m
螺纹类型 A:
调用 ,添加/删除 m 的一些元素(保证不同时在线程类型 B 中读/写的元素)insert()
erase()
螺纹类型 B:
调用 M,执行类似 .(保证线程类型 B 不会同时修改同一个元素,并且 key 已经存在)operator[]
m[key] = value
m
在没有锁的情况下同时执行这些操作是否安全?
答:
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
标准是否明确指出它们不是线程安全的,或者我们是否必须假设它们没有提到线程安全?
1赞
user253751
10/26/2022
在某些情况下,对容器的并发访问是安全的 - 大多数情况下,当没有线程修改容器本身,而只是修改其中的元素时。
评论
m_a
m_b
B