std :: map插入线程安全吗?

时间:2020-05-09 07:08:07

标签: c++ c++11 stl thread-safety

我知道std::map类在两个线程中读写时是线程不安全的。但是可以插入多个线程吗?

void writeMap()
{ 
    for (int i = 0; i < 1000; i++)
    {
        long long random_variable = (std::rand()) % 1000;
        std::cout << "Thread ID -> " << std::this_thread::get_id() << " with looping index " << i << std::endl;
        k1map.insert(std::make_pair(i, new p(i)));
    }
}

int main()
{
    std::srand((int)std::time(0)); 
    for (int i = 0; i < 1000; ++i)
    {
        long long random_variable = (std::rand()) % 1000;
        std::thread t(writeMap);
        std::cout << "Thread created " << t.get_id() << std::endl;
        t.detach();
    }
    return 0;
}

无论我尝试多少次,此类代码都能正常运行。

3 个答案:

答案 0 :(得分:0)

否,std::map::insert不是线程安全的。

大多数标准库类型只有在单独的线程中使用单独的对象实例时才是线程安全的。看看容器docs的线程安全部分。

答案 1 :(得分:0)

程序在某种程度上很复杂,就像魔术(LOL)一样。 不同的IDE上的代码运行结果是不同的。 以前,我使用VS2013,这总是正确的。 但是在vs19和linux上,相同代码的结果是错误的。 也许在vs2013上,MAP的实现有特殊的方式。

答案 2 :(得分:0)

正如@NutCracker所述,await不是线程安全的。

但是,如果发布的代码工作正常,我认为原因是该地图非常快地被一个线程填充,结果,其他线程不再修改该地图。

相关问题