unordered_map可以同时找到并插入吗?

Could unordered_map find and insert at the same time?

本文关键字:插入 map unordered      更新时间:2023-10-16

我是 c++ 多线程编程的新手。我从网上阅读了一些文档和一些文章,并注意到在 STL unordered_map 中同时允许多查找操作,而不允许多插入操作。

我有两个问题:

  1. 可以同时找到操作和插入操作吗?例如

    std::string x = "jim";
    std::string y = "marry";
    std::unordered_map<std::string, int> map;  
    // Thead A executes below code 
    auto iterator = map.find(x);   
    // Thread B executes below code
    map.insert(std::make_pair(y, "value"));
    

    请注意,这里的 x 和 y是不一样的。

  2. 如果 x 和 y 相同怎么办?如果我们找到密钥并同时插入相同的密钥会发生什么?

谢谢大家,如果你用你获得这些知识的参考来回答这个问题。

标准容器不是线程安全的。因此,您需要将unordered_map包装到类中,并公开线程安全函数以插入和查找项目,例如使用互斥锁。

下面是一些伪代码:

class my_map
{
private:
static std::mutex my_mutex;
typedef map<std::string, int> my_map;
std::unordered_map my_map;
public:
void insert(...)
{
my_mutex.lock();
map.insert(...);
my_mutex.unlock(); // still not safe in case of exception
}
my_map::iterator find(...)
{
my_mutex.lock();
var result = map.find(...);
my_mutex.unlock();
return result;
}
}

两者的答案: 由于C++内存模型的规则,这种数据竞争会导致未定义的行为。所以任何事情都可能发生。您必须保证头安全操作,并应添加 std::mutex,例如 (https://en.cppreference.com/w/cpp/thread/mutex(