C++11 magic statics的发布是线程安全的吗?

C++11 magic statics的发布是线程安全的吗?,c++11,static,thread-safety,C++11,Static,Thread Safety,想象一下我有这个: const string& get_name() { static auto* ptr_name=new string("Ron"); return *ptr_name; } 如果多个线程正在调用get_name,那么这是否为UB?在C++11和forward中是线程安全的 VS-2013尚未实现C++11的这一部分。VS-14的作用是: 自C++11以来,函数作用域静态变量的初始化是线程安全的:第一次调用get_name()将初始化ptr_name,阻止其他线程,

想象一下我有这个:

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

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

在C++11和forward中是线程安全的

VS-2013尚未实现C++11的这一部分。VS-14的作用是:


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


<> P>以前的C++实现,没有这样的保证,所有的赌注都被关闭了:我已经知道魔法静力学,我只是不知道如果从一个函数返回它是静态的发布静态。我在考虑顺序一致性。。。函数的用户可以看到垃圾或null作为返回值,或者如果他们看到字符串的实际地址,他们可以看到地址指向的垃圾(而不是“Ron”),也可以看到Microsoft Connect、Microsoft Connect和任意数量的关于堆栈溢出崩溃的帖子。微软把这件事搞砸了。