0
我有兩個線程:threadsafety VS迭代器有效性
- 線程A插入到
std::map
- 線程B從
std::map
消除由於std::map::erase
和std::map::insert
保持地圖有效的所有迭代器,我似乎無法理解在這種情況下可能發生的競爭狀況。
我有兩個線程:threadsafety VS迭代器有效性
std::map
std::map
消除由於std::map::erase
和std::map::insert
保持地圖有效的所有迭代器,我似乎無法理解在這種情況下可能發生的競爭狀況。
評論指出是正確的。我將它們與你的聲明相結合:
std::map::erase
和std::map::insert
保持地圖有效它們只能順序執行的所有迭代器。
如果它們並行執行,則一個線程(當它開始工作時)可能會面對一個部分修改的對象(另一個線程正在處理它)。對部分修改的對象的操作結果未定義。這是問題的根源。
如果你同步訪問你的對象與說mutex
一切都會正常工作。容器沒有內置同步,因爲這會顯着減慢他們的工作,而這只是有時需要的。
地圖的內部狀態可能會在同時進行兩次調用時混亂。想到「尺寸」。 – NathanOliver
由於只有最新的C++標準中的const函數才需要線程安全,並且std :: map不是線程安全的,爲什麼在調用非const函數時不會期望競爭條件? – UKMonkey