【发布时间】:2019-01-31 16:50:40
【问题描述】:
假设我有一个已初始化但为空的 std::unordered_map,以及将填充它的两个同时线程。这两个线程只会写入映射,在两个线程完成之前不会从映射中读取任何内容。
此外,这两个线程永远不会对映射中的相同键进行操作。例如,假设线程 1 将填充键“A”到“M”,线程 2 将同时填充键“N”到“Z”。
这个线程安全吗?
在我当前的实现中,我有 8 个线程以上述方式写入单个互斥的 std::unordered_map。互斥锁显然会减慢进程(填充了近 10,000 个键),所以我想知道我是否还需要互斥锁。
谢谢大家!
【问题讨论】:
-
我看到了类似的问题。如果性能很重要,请考虑不同的数据结构。如果它们不通过键相交,那么每个线程的 unordered_map 可能是最好的。
-
阅读 std::unordered_map::merge。两个线程可以填充两个不同的映射,然后一个可以合并它们。
-
@ÖöTiib 这需要 C++17。 Q 被标记为 C++11
标签: c++ c++11 unordered-map