C ++关联容器(unordered_map)从多个线程中同时查找并插入相同的键

问题描述 投票:0回答:1

我知道有关同时查找和插入的其他类似问题,我的问题专门针对同时查找和插入相同的密钥。

针对容器要求的每个c ++ 14标准23.2.5“ 15.如果(N + n)

根据此要求,如果我使用unordered_map的reserve方法来预分配存储桶,则应注意大多数赛车情况。但是,如果您同时从多个线程中插入并找到SAME KEY,该怎么办?

更新:我真正的意思是在同时插入时会发现读取垃圾?

c++ unordered-map
1个回答
0
投票

我花了一些时间阅读gcc的实现。

  1. 如果一个线程使用]插入>

    unordered_map mp;mp [key] = value;

    而一个线程使用以下命令读取:自动= mp.find(key);//然后使用它来访问键值对]

    然后,使用find()返回的迭代器可能会导致垃圾,因为这是在mp [key] = value:]期间发生的事情>

    1. operator []动态创建一个包含(empty_value)的节点
    2. 存储桶指针指向新创建的(empty_value)节点。
    3. “” =“然后在新创建的节点中放入”值“。
  2. find(key)可以在步骤2之后且步骤3完成之前读取垃圾。

  • 如果我们使用unordered_map :: insert,则将有所不同,因为发生的事情是:

    1. 包含(值)的节点是动态创建的。
    2. 存储桶指针指向新创建的节点。
  • 因此,当使用find(key)时,unordered_map无法找到键值对,或者键值对已完全创建。

    这是我对实现的理解。如果我错了,请纠正我。

    © www.soinside.com 2019 - 2024. All rights reserved.