簡體   English   中英

C++關聯容器(unordered_map)從多個線程同時查找並插入同一個key

[英]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 實現。

  1. 如果一個螺紋插入使用

    unordered_map mp; mp[key] = 值;

    而一個線程讀取使用: auto it = mp.find(key); // 然后用它來訪問鍵值對

    那么是的,使用 find() 返回的迭代器可能會得到垃圾,因為這是在 mp[key] = value 期間發生的事情:

    1. operator[] 動態創建一個包含 (empty_value) 的節點
    2. 存儲桶指針指向新創建的 (empty_value) 節點。
    3. “=”然后將“值”放入新創建的節點中。

    find(key) 可以在第 2 步之后和第 3 步完成之前讀取垃圾。

  2. 如果我們使用unordered_map::insert,那么它會有所不同,因為發生的事情是:

    1. 包含(值)的節點是動態創建的。
    2. 桶指針指向新創建的節點。

所以在使用find(key)時,要么unordered_map找不到鍵值對,要么鍵值對已經完全創建。

這是我對實現的理解。 如果我錯了,請糾正我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM