[英]C++ boost unordered_map - determine if key exists in container
[英]C++ associative container (unordered_map) find and insert the same key at the same time from multiple threads
我知道關於同時查找和插入的其他類似問題,我的問題是特定於同時查找和插入 SAME KEY 的。
根據容器要求 23.2.5 的 c++ 14 標准“15. 如果 (N+n) < z * B,插入和 emplace 成員不應影響迭代器的有效性,其中 N 是插入之前容器中的元素數操作,n 是插入的元素數,B 是容器的桶數,z 是容器的最大負載因子。”。
根據這個要求,如果我使用 unordered_map 的保留方法來預先分配桶,這應該可以解決大多數賽車情況。 但是,如果您同時從多個線程插入並找到 SAME KEY 呢?
更新:我真正的意思是同時插入時會發現讀取垃圾?
我花了一些時間閱讀 gcc 實現。
如果一個螺紋插入使用
unordered_map mp; mp[key] = 值;
而一個線程讀取使用: auto it = mp.find(key); // 然后用它來訪問鍵值對
那么是的,使用 find() 返回的迭代器可能會得到垃圾,因為這是在 mp[key] = value 期間發生的事情:
find(key) 可以在第 2 步之后和第 3 步完成之前讀取垃圾。
如果我們使用unordered_map::insert,那么它會有所不同,因為發生的事情是:
所以在使用find(key)時,要么unordered_map找不到鍵值對,要么鍵值對已經完全創建。
這是我對實現的理解。 如果我錯了,請糾正我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.