出版魔法静态线程安全吗?

时间:2014-11-28 03:55:12

标签: c++11 static thread-safety

想象一下,我有这个:

const string& get_name()
{
static auto* ptr_name=new string("Ron");
return *ptr_name;
}

如果多个线程正在调用get_name,那么是否是UB?

2 个答案:

答案 0 :(得分:4)

这在C ++ 11和转发中是线程安全的。

VS-2013还没有实现C ++ 11的这一部分。 VS-14确实:

http://blogs.msdn.com/b/vcblog/archive/2014/06/11/c-11-14-feature-tables-for-visual-studio-14-ctp1.aspx

答案 1 :(得分:2)

从C ++ 11开始,函数范围静态变量的初始化是线程安全的:第一次调用get_name()将初始化ptr_name,阻塞其他线程,直到初始化为止完成。所有后续调用都将使用初始值。

使用先前的C ++实现,没有这样的保证,所有的赌注都关闭