想象一下,我有这个:
const string& get_name()
{
static auto* ptr_name=new string("Ron");
return *ptr_name;
}
如果多个线程正在调用get_name,那么是否是UB?
答案 0 :(得分:4)
这在C ++ 11和转发中是线程安全的。
VS-2013还没有实现C ++ 11的这一部分。 VS-14确实:
答案 1 :(得分:2)
从C ++ 11开始,函数范围静态变量的初始化是线程安全的:第一次调用get_name()
将初始化ptr_name
,阻塞其他线程,直到初始化为止完成。所有后续调用都将使用初始值。
使用先前的C ++实现,没有这样的保证,所有的赌注都关闭