C++0x静态初始化和线程安全

10

我知道根据C++03标准,函数作用域静态初始化不保证线程安全:

void moo()
{
    static std::string cat("argent");  // not thread safe
    ...
}

随着C++0x标准最终提供了标准线程支持,函数范围内的静态初始化是否需要保证线程安全?


3
我认为从今天起它将被称为C++1x。 - Matthieu N.
Bjarne Stoustrup说把x看作十六进制数,因此仍然是0x。 - John Dibling
@John:无论他怎么想或喜欢什么,我的理解是ISO指南要求像标准这样的文档版本控制采用十进制。 - Matthieu N.
5
ISO的指南与此无关,因为C++0x不是标准的正式名称,从来都不是,也永远不会是。对于C++1x也是一样的情况。这不是ISO的名称,所以ISO的规则并不重要。 - jalf
1个回答

9

看起来初始化应该是线程安全的,因为如果对象在进入函数时动态初始化,则保证在关键部分执行:

§ 6.7 stmt.decl

4. ...第一次控制通过其声明初始化这样一个对象...如果控制同时进入声明而对象正在初始化,则并发执行必须等待初始化完成...

存在一个潜在的边缘情况,即在从 main() 返回后,静态对象的析构函数在静态局部已经销毁后调用该函数,行为是未定义的。但是,这应该很容易避免。


3
“名言警句”“应该很容易避免”,但在一般情况下,避免它非常困难。 - deft_code

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接