Meyers对Singleton模式线程的实现安全吗? [英] Is Meyers' implementation of the Singleton pattern thread safe?

查看:138
本文介绍了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中,它是线程安全的.根据标准:

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上的魔术静态器)如下:

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: 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中)或多或少(在C ++ 03中)完全锁定基本上是确保所有平台上适当并发的最简单方法,而大多数形式的double-除非指令与策略性地放置内存障碍交错,否则检查的锁定模式变体可能会受到某些架构上的竞争条件的困扰.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆