Meyers是否执行Singleton模式线程安全? [英] Is Meyers implementation of Singleton pattern thread safe?
问题描述
使用懒惰初始化,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
:
如果控件进入
声明同时初始化变量时,并发执行将等待完成初始化。
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
- Visual Studio: supported since Visual Studio 2015
- GCC: supported since 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模式线程安全?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!