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

标签 c++ thread-safety c++11 static-initializer

我知道在 C++03 标准中,函数范围的静态初始化不保证是线程安全的:

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

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

最佳答案

似乎初始化是线程安全的,因为在进入函数时动态初始化对象的情况下,它保证在临界区执行:

§ 6.7 stmt.decl

4。 ...这样的对象在控件第一次通过其声明时被初始化...如果控件在初始化对象时并发进入声明,则并发执行应等待初始化完成.../p>

有一个潜在的边缘情况,如果从 main() 返回后,静态对象的析构函数在静态本地已经销毁后调用该函数,则行为未定义。然而,这应该很容易避免。

关于C++0x 静态初始化和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1987679/

相关文章:

c++ - 为什么 std::forward 将我的左值变成右值?

c++ - 应用程序无法正确启动(0xc000007b)

c++ - 是什么导致类型不完整? (QGraphicsItem : Source or target has incomplete type)

python - uuid.uuid4() 在具有多处理功能的 Windows 上使用是否安全?

java - 非线程安全代码意外地给出可重复的结果

c++ - 如何将 static_cast 与双重类型转换一起使用

C++将局部变量存储到 vector 中可防止它在超出范围时被破坏

Rcpp调用的c++计数算法模板

java - 扩展 log4j/slf4j 记录器

c++ - 在基类之间 move 语义