![](/img/trans.png)
[英]Is using std::find and C::insert() thread safe if iterators are not invalidated by insert
[英]Is std::map access thread safe if iterators to it are never invalidated
所以我想生成一個像這樣的地圖: std::map<std::string, std::atomic<bool>>
。 我的用例是一些運行時檢查,以查看是否滿足某些條件(真或假); 我在這張地圖中緩存了條件檢查的結果,因為這些檢查很昂貴。
這個想法是我用std::call_once
預先填充這個地圖,然后再也不刪除或插入元素。 但是,我可以通過 find() 並發訪問它,並且這些訪問可能會使用 store(true) 更改std::atomic
值的值。
現在我想知道這是否是線程安全的? 我必須承認我覺得我在這里處於未定義的行為領域。
如果它的迭代器永遠不會失效,那么 std::map 訪問線程是否安全
這不是充分的前提。 插入不會使迭代器失效,但會引入與其他訪問線程的競爭。
這個想法是我預先填充這張地圖
這似乎足夠了。 只要沒有線程修改它,從多個線程並發讀取(查找、遍歷等)一個標准映射是安全的。
並且這些訪問可能會更改
std::atomic
的值
訪問,甚至寫一個原子對象也是線程安全的。 但請記住,多個原子操作的序列作為一個整體並不是原子的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.