小编典典

Meyers 实现的 Singleton 模式线程安全吗?

all

Singleton(Meyers’Singleton)线程的以下使用延迟初始化的实现是否安全?

static Singleton& instance()
{
     static Singleton s;
     return s;
}

如果不是,为什么以及如何使其线程安全?


阅读 70

收藏
2022-08-27

共1个答案

小编典典

C++11中,它是线程安全的。根据标准搂6.7 [stmt.dcl] p4

如果在变量初始化时控制同时进入声明,则 并发执行将等待 初始化完成。

GCC 和 VS 对该特性的支持(Dynamic Initialization and Destruction with
Concurrency
,在 MSDN 上也称为Magic
Statics
)如下:

感谢@Mankarse 和@olen_gam 的评论。


C++03中,此代码不是线程安全的。Meyers 有一篇名为“C++ and
the Perils of Double-Checked
Locking”
的文章讨论了该模式的线程安全实现,其结论或多或少是(在
C++03
中)围绕实例化方法进行完全锁定基本上是确保所有平台上正确并发的最简单方法,而大多数形式的双重检查锁定模式变体可能会在某些架构上受到竞争条件的影响,除非指令与策略性地放置内存屏障交错。

2022-08-27