网站首页 > 基础教程 正文
const bg::AppSettings& bg::AppSettings::GetInstance()
{
static AppSettings instance;
return instance;
}
对于以上单例模式代码,在 C++11(及更高版本)中,函数局部静态AppSettings的构造保证是线程安全的。
编译器将在 AppSettings 旁边放置一个隐藏标志,指示它是否:
- Not constructed.
- Being constructed.
- Is constructed.
第一个线程将发现标志设置为“Not constructed”并尝试构造该对象。成功构建后,标志将设置为“Is constructed”。如果另一个线程出现并发现标志设置为“Being constructed”,它将等待,直到标志设置为“Is constructed”。
如果构造因异常而失败,则标志将设置为“Not constructed”,并且将在下一次传递时重试构造(在同一线程或不同线程上)。
对象实例将在程序的其余部分中保持构造状态,直到main() 返回,此时实例将被销毁。
每次任何执行线程通过 AppSettings::GetInstance() 时,它将引用完全相同的对象。
在 C++98/03 中,不保证构造是线程安全的。
如果 AppSettings 的构造函数递归地进入 AppSettings::GetInstance(),则行为未定义。
如果编译器可以“在编译时”了解如何构造实例,则允许这样做。
如果 AppSettings 有一个 constexpr 构造函数(用于构造实例的构造函数),并且该实例是用 constexpr 限定的,则编译器需要在编译时构造实例。如果实例是在编译时构造的,则“未构造/构造”标志将被优化掉。
参考
[1]C++11 Singleton. Static variable is thread safe? Why? (https://stackoverflow.com/questions/34457432/c11-singleton-static-variable-is-thread-safe-why)
[2]Is Meyers' implementation of the Singleton pattern thread safe? (https://stackoverflow.com/questions/1661529/is-meyers-implementation-of-the-singleton-pattern-thread-safe)
你好,我是七昂,致力于分享C++、操作系统、软件架构、机器学习、效率提升等系列文章。希望我们能一起探索程序员修炼之道,高效学习、高效工作。如果我的创作内容对您有帮助,请点赞关注。如果有问题,欢迎随时与我交流。感谢你的阅读。
知乎、公众号:七昂的技术之旅
猜你喜欢
- 2024-10-12 C++中override与overload的区别:深入解析与应用
- 2024-10-12 C++中的static_cast #程序代码 c++ static用法
- 2024-10-12 编码规范-C++:尽可能使用static_cast而不是reinterpret_cast
- 2024-10-12 C++类对象中的this指针与静态成员:理解与应用
- 2024-10-12 看完就会用的C++17特性总结 c++ 17 新特性
- 2024-10-12 C++|变量的类型系统和属性 c++变量有哪几种作用域
- 2024-10-12 C++友元和静态函数:如何用特殊的方式访问和管理类的成员
- 2024-10-12 C++中的static关健字 c static关键字
- 2024-10-12 C++静态成员变量和静态成员函数使用总结
- 2024-10-12 C++知识分享:静态成员变量,你弄懂了吗?
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)