如何在多线程编程中使用 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 都没有关系。除非容器是线程安全的,否则您必须自己提供保护。
我在某处读到说 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 都没有关系。除非容器是线程安全的,否则您必须自己提供保护。