gpt4 book ai didi

C++ 11单例。静态变量是线程安全的吗?为什么?

转载 作者:行者123 更新时间:2023-12-04 16:43:08 26 4
gpt4 key购买 nike

我刚刚读到,这个构造:

const bg::AppSettings& bg::AppSettings::GetInstance()
{
static AppSettings instance;
return instance;
}

创建单例的线程安全和工作方式是什么?我是否正确,每次我调用此方法时,静态AppSettings变量都相同?我对这方面的范围感到困惑...

我通常的方法是将unique_ptr用作类的静态成员...但这似乎可行...有人可以向我解释一下,这是怎么回事?

顺便说一句:const在这里有意义吗?

最佳答案

在C++ 11(及更高版本)中,函数local static AppSettings的构造保证是线程安全的。注意:Visual Studio直到VS-2015才实现C++ 11的这一方面。

编译器将在AppSettings旁边放置一个隐藏标志,指示是否为:

  • 未构造。
  • 正在构建。
  • 已构建。

  • 第一个线程将找到设置为“未构造”的标志,并尝试构造该对象。成功构建后,标记将设置为“已构建”。如果出现另一个线程并找到设置为“正在构建”的标志,它将等待直到标志设置为“正在构建”。

    如果构造因异常而失败,则标志将被设置为“未构造”,并且构造将在下一次通过时(在同一线程或不同线程上)重试。

    对象 instance将为程序的其余部分构造,直到 main()返回为止,此时 instance将被销毁。

    每当任何执行线程通过 AppSettings::GetInstance()时,它将引用完全相同的对象。

    在C++ 98/03中,不能保证构造是线程安全的。

    如果 AppSettings的构造函数递归地输入 AppSettings::GetInstance(),则该行为未定义。

    如果编译器可以在“编译时”看到如何构造 instance,则可以。

    如果 AppSettings具有 constexpr构造函数(用于构造 instance的构造函数),并且 instanceconstexpr限定,则要求编译器在编译时构造 instance。如果在编译时构造了 instance,则将优化掉“not-constructed/constructed”标志。

    关于C++ 11单例。静态变量是线程安全的吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34457432/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com