gpt4 book ai didi

multithreading - std::map 在 c++11 中插入线程安全吗?

转载 作者:行者123 更新时间:2023-12-03 12:55:02 25 4
gpt4 key购买 nike

我有非常简单的代码,其中多个线程尝试在 std::map 中插入数据,根据我的理解,这应该会导致程序崩溃,因为这是数据竞争

std::map<long long,long long> k1map;
void Ktask()
{
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(random_variable, random_variable));
}
}


int main()
{
std::srand((int)std::time(0)); // use current time as seed for random generator
for (int i = 0; i < 1000; ++i)
{
std::thread t(Ktask);
std::cout << "Thread created " << t.get_id() << std::endl;
t.detach();
}

return 0;
}

但是我多次运行它并且没有应用程序崩溃,如果使用 pthread 运行相同的代码并且 c++03 应用程序崩溃,所以我想知道 c++11 中是否有一些更改使 map 插入线程安全?

最佳答案

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

您的示例不会崩溃的原因有很多。由于系统调度程序的原因,或者因为它们完成得非常快(1000 次迭代并不算多),您的线程可能会以串行方式运行。您的 map 将很快填满(只有 1000 个节点),因此稍后的插入实际上不会修改结构并减少崩溃的可能性。或者也许您正在使用的实现是线程安全的。

关于multithreading - std::map 在 c++11 中插入线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38517954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com