Singleton(Meyers’Singleton)线程的以下使用延迟初始化的实现是否安全?
Singleton
static Singleton& instance() { static Singleton s; return s; }
如果不是,为什么以及如何使其线程安全?
在C++11中,它是线程安全的。根据标准,搂6.7 [stmt.dcl] p4:
搂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 中)围绕实例化方法进行完全锁定基本上是确保所有平台上正确并发的最简单方法,而大多数形式的双重检查锁定模式变体可能会在某些架构上受到竞争条件的影响,除非指令与策略性地放置内存屏障交错。