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.
相关文章