插入单独的线程时std :: map读取

时间:2016-07-13 09:42:20

标签: c++ dictionary thread-safety

我有这样的地图

map<string,A>

现在当我从线程I迭代地图时,线程II正在向它插入一些东西。这种插入是否会影响阅读?

2 个答案:

答案 0 :(得分:5)

是的,插入物会影响读数。该标准不提供线程安全保证。存在竞争条件,并且导致不确定的行为。

答案 1 :(得分:0)

是的,它会影响阅读。您需要在这两个线程之间使用其他同步机制。阅读std::mutexstd::unique_lock

请参阅下面的示例代码:

#include <map>
#include <string>
#include <mutex>
#include <memory>

class MapWithMutex
{
public:
    int readFromMap(const std::string& key)
    {
        std::unique_lock<std::mutex>(mtx);
        //add some check if elements exists
        return myMap[key];
    }
    void insertToMap(const std::string& key, int value)
    {
        //add check if element doesn't already exist
        std::unique_lock<std::mutex>(mtx);
        myMap[key] = value;
    }
private:
    std::map<std::string,int> myMap;
    std::mutex mtx;
};

int main() {
    MapWithMutex thSafeMap;
    //pass thSafeMap object to threads
    return 0;
}

请记住使关键部分尽可能小