【发布时间】:2019-08-04 17:50:39
【问题描述】:
我是 C++ 新手。我有一个关于std::map 和std::unordered_map 的局部变量用法的线程安全问题。
如果我在一个函数中声明了std::map和std::unordered_map的局部变量,并且想在函数内的局部变量中插入元素或增加元素值,当函数被调用时,这些局部变量是线程安全的吗?多线程无锁?
示例代码:
void func(const std::string &a, int b)
{
std::map<std::string, int> var1;
auto search = var1.find(a)
if ( search != var1.end() )
{
var1.insert(make_pair(a,b) );
}
else
{
var1[a] = var1[a] + b;
}
std::unordered_map<std::string, int> var2;
auto search = var2.find(a)
if ( search != var2.end() )
{
var2.insert(make_pair(a,b) );
}
else
{
var2[a] = var2[a] + b;
}
}
func() 将被多个线程调用。 var1 和 var2 线程安全吗?或者,函数中是否需要使用互斥锁?
【问题讨论】:
-
局部变量是local。任何线程不安全的东西都有被多个线程访问的non-local。需要互斥锁来准确保护此类数据。
-
在答案部分请不要在这里
-
局部变量存储在堆栈中,每个线程都有自己的堆栈,因此任何仅本地的都是线程安全的。除非在文档中如此指定,否则任何非本地的东西都不是线程安全的。
标签: c++ multithreading