Meyers 的 Singleton:线程安全评估和增强
Meyers 的 Singleton 模式实现利用延迟初始化,但其线程安全性仍然存在一个担忧。本文深入研究了给定代码中线程安全的复杂性:
static Singleton& instance() { static Singleton s; return s; }
在 C 11 及以后
在 C 11 中,全局对象的延迟初始化是凭借标准的保证,线程安全:并发初始化将导致等待直到其完成。 GCC 和 Visual Studio 都支持此功能。
因此,在 C 11 或更高版本的环境中,Meyers 的 Singleton 实现是线程安全的。
在 C 03 及之前
在 C 03 及更早版本中,提供的代码不是线程安全的。正如 Meyers 在他的文章中所述,双重检查锁定模式可能容易受到某些架构上的竞争条件的影响。为了在此上下文中实现线程安全,建议对实例化方法进行完全锁定。
C 03 线程安全代码
这里是代码的修改C 03 线程安全:
static Singleton*& instance() { static Singleton* s = nullptr; static std::mutex s_mutex; std::lock_guard<std::mutex> guard(s_mutex); if (!s) s = new Singleton; return s; }
该实现在初始化期间使用互斥体来同步访问,确保线程安全。
以上是Meyers 的 Singleton 是线程安全的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!