如何在多线程编程中使用 map/unordered_map 上的 find 函数

How to use find function on map/unordered_map in multi-thread programming

我在某处读到说 find() 在 STL 上不是线程安全的 map 因为当其他线程插入地图时,地图本身正在重新平衡,所以 find() 可能不是 return 正确的迭代器,即使条目确实在地图中。我的观察倾向于呼应这一点。哈希映射 (unordered_map) 怎么样?我担心它可能有同样的问题,但不清楚原因。

那么在多线程上下文中调用 find() 的正确方法是什么,或者有任何替代方法吗?

示例可以是:

std::map<int, std::string> the_map;

在线程 1 中:

// Step1
_mutex.lock();
the_map[1] = "this";
_mutex.unlock();

...
// Step3
if (the_map.find(1) == the_map.end()) {
    throw("Cannot find!");
}

在线程 2 中

// Step2
_mutex.lock();
the_map[2] = "that";
_mutex.unlock();

如果第 2 步和第 3 步同时进行,则第 3 步可能会中断。

None 的标准库容器是线程安全的。如果你想做这种事情,你必须通过互斥锁保护所有访问(读和写)。

您必须获取调用 find 的互斥量,以便在执行查找调用时没有人可以写入地图。这适用于任何非线程安全的容器或结构,您必须经常保护它免于同时读写。 Find 正在阅读。无论您是在矢量、列表、地图、unordered_map 还是其他东西上使用 std::find 都没有关系。除非容器是线程安全的,否则您必须自己提供保护。