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

时间:2018-10-11 08:46:38

标签: c++ multithreading stl unordered-map

我是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相同怎么办?如果找到密钥并同时插入相同的密钥会发生什么?

如果您回答此问题并获得参考,您将获得知识。

2 个答案:

答案 0 :(得分:1)

标准容器不是线程安全的。因此,您需要将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;
    }
}

答案 1 :(得分:1)

这两个答案: 由于C ++内存模型的规则,这种数据争用导致不确定的行为。所以什么都可能发生。您必须保证安全执行操作,并应添加std :: mutex例如(https://en.cppreference.com/w/cpp/thread/mutex