首页 >后端开发 >C++ >Meyers 的 Singleton 是线程安全的吗?

Meyers 的 Singleton 是线程安全的吗?

DDD
DDD原创
2024-12-29 11:40:11417浏览

Is Meyers' Singleton Thread-Safe?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn