我讀到某處說find()在 STL 上不是執行緒安全的,map因為當其他執行緒插入映射時,映射本身正在重新平衡,因此find()即使條目確實在映射中也可能不會回傳正確的迭代器。我的觀察往往與此相呼應。哈希映射 ( 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 步可能會中斷。
uj5u.com熱心網友回復:
沒有一個標準庫容器是執行緒安全的。如果你想做這種事情,你必須通過互斥鎖保護所有訪問(讀取和寫入)。
uj5u.com熱心網友回復:
您必須使用互斥鎖進行呼叫find,以便在執行 find 呼叫時沒有人可以寫入地圖。這適用于任何非執行緒安全的容器或結構,您必須經常保護它不同時讀取和寫入。Find在看書。無論您是在向量、串列、地圖、unordered_map 還是其他東西上使用 std::find 都沒有關系。除非容器是執行緒安全的,否則您必須自己提供保護。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422755.html
標籤:
