Is Meyers#39; implementation of the Singleton pattern thread safe?(Meyers 实现的 Singleton 模式线程安全吗?)
问题描述
Singleton
(Meyers 的 Singleton)线程的以下使用延迟初始化的实现是否安全?
Is the following implementation, using lazy initialization, of Singleton
(Meyers' Singleton) thread safe?
static Singleton& instance()
{
static Singleton s;
return s;
}
如果不是,为什么以及如何使其线程安全?
If not, why and how to make it thread safe?
推荐答案
在 C++11,它是线程安全的.根据标准,§6.7 [stmt.dcl] p4
:
In C++11, it is thread safe. According to the standard, §6.7 [stmt.dcl] p4
:
如果控制进入在变量初始化的同时声明,并发执行应该等待初始化完成.
If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.
GCC 和 VS 对该功能的支持 (并发的动态初始化和销毁,也称为 MSDN 上的 Magic Statics) 如下:
GCC and VS support for the feature (Dynamic Initialization and Destruction with Concurrency, also known as Magic Statics on MSDN) is as follows:
- Visual Studio:自 Visual Studio 2015
- GCC:自 GCC 4.3 起支持
感谢@Mankarse 和@olen_gam 的评论.
Thanks to @Mankarse and @olen_gam for their comments.
在 C++03 中,此代码不是线程安全的.Meyers 有一篇名为 C++ 和双重检查锁定的风险" 的文章,其中讨论了该模式的线程安全实现,结论或多或少是,(在 C++03 中)围绕实例化方法的完全锁定基本上是确保所有平台上正确并发的最简单方法,而大多数形式的双检查的锁定模式变体可能会受到某些架构上的竞争条件的影响,除非指令与战略性地放置内存屏障交错.
In C++03, this code wasn't thread safe. There is an article by Meyers called "C++ and the Perils of Double-Checked Locking" which discusses thread safe implementations of the pattern, and the conclusion is, more or less, that (in C++03) full locking around the instantiating method is basically the simplest way to ensure proper concurrency on all platforms, while most forms of double-checked locking pattern variants may suffer from race conditions on certain architectures, unless instructions are interleaved with strategically places memory barriers.
这篇关于Meyers 实现的 Singleton 模式线程安全吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Meyers 实现的 Singleton 模式线程安全吗?


基础教程推荐
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 常量变量在标题中不起作用 2021-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 如何检查GTK+3.0中的小部件类型? 2022-11-30