2016-11-30 57 views
0

我有兩個線程:threadsafety VS迭代器有效性

  • 線程A插入到std::map
  • 線程B從std::map

消除由於std::map::erasestd::map::insert保持地圖有效的所有迭代器,我似乎無法理解在這種情況下可能發生的競爭狀況。

+0

地圖的內部狀態可能會在同時進行兩次調用時混亂。想到「尺寸」。 – NathanOliver

+0

由於只有最新的C++標準中的const函數才需要線程安全,並且std :: map不是線程安全的,爲什麼在調用非const函數時不會期望競爭條件? – UKMonkey

回答

2

評論指出是正確的。我將它們與你的聲明相結合:

std::map::erasestd::map::insert保持地圖有效它們只能順序執行的所有迭代器。

如果它們並行執行,則一個線程(當它開始工作時)可能會面對一個部分修改的對象(另一個線程正在處理它)。對部分修改的對象的操作結果未定義。這是問題的根源。

如果你同步訪問你的對象與說mutex一切都會正常工作。容器沒有內置同步,因爲這會顯着減慢他們的工作,而這只是有時需要的。