C++如何实现单例模式_C++设计模式之Singleton的线程安全实现

单例模式确保类唯一实例并提供全局访问点。C++中推荐使用局部静态变量实现线程安全单例,因C++11保证其初始化线程安全,兼具简洁高效特性,优于饿汉式、手动加锁或双重检查锁定方式。

c++如何实现单例模式_c++设计模式之singleton的线程安全实现

单例模式(Singleton)确保一个类只有一个实例,并提供全局访问点。在C++中实现线程安全的单例模式,尤其是在多线程环境下避免竞态条件,是实际开发中的常见需求。

饿汉式(Eager Initialization)

饿汉式在程序启动时就创建实例,天然线程安全,因为没有延迟初始化的竞争问题。

优点:简单、线程安全。
缺点:可能浪费资源,即使从未使用该实例也会被创建。

示例代码:

class Singleton {private:    static Singleton instance;    Singleton() = default;public:    static Singleton& getInstance() {        return instance;    }    Singleton(const Singleton&) = delete;    Singleton& operator=(const Singleton&) = delete;};

// 静态成员定义Singleton Singleton::instance;

懒汉式 + 局部静态变量(C++11 起线程安全)

C++11 标准规定:函数内的局部静态变量初始化是线程安全的。这是最推荐的方式,简洁且高效。

立即学习“C++免费学习笔记(深入)”;

示例代码:

class Singleton {private:    Singleton() = default;public:    static Singleton& getInstance() {        static Singleton instance;  // C++11 线程安全        return instance;    }    Singleton(const Singleton&) = delete;    Singleton& operator=(const Singleton&) = delete;};

说明:编译器保证首次控制流到达声明处时,实例只构造一次,且多线程并发调用也安全。

手动加锁实现(适用于旧标准)

在C++11之前,或需要更复杂的控制时,可使用互斥锁实现延迟初始化。

示例代码:

#include 

class Singleton {private:static std::unique_ptr instance;static std::mutex mtx;Singleton() = default;public:static Singleton& getInstance() {std::lock_guard lock(mtx);if (!instance) {instance = std::make_unique();}return *instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;};

// 静态成员定义std::unique_ptr Singleton::instance = nullptr;std::mutex Singleton::mtx;

注意:性能较低,每次调用都加锁。可通过“双重检查锁定”优化,但需谨慎处理内存可见性。

双重检查锁定(Double-Checked Locking)

减少锁竞争,只在第一次初始化时加锁。C++中需配合 std::atomic 和内存屏障使用。

示例代码:

#include #include 

class Singleton {private:static std::atomic<Singleton> instance;static std::mutex mtx;Singleton() = default;public:static Singleton& getInstance() {Singleton ptr = instance.load(std::memory_order_relaxed);if (ptr == nullptr) {std::lock_guard lock(mtx);ptr = instance.load(std::memory_order_relaxed);if (ptr == nullptr) {ptr = new Singleton();instance.store(ptr, std::memory_order_relaxed);}}return *ptr;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;};

// 静态成员定义std::atomic Singleton::instance{nullptr};std::mutex Singleton::mtx;

提示:虽然可行,但容易出错,不推荐手动实现,优先使用局部静态变量方式。

基本上就这些。现代C++中,推荐使用局部静态变量实现线程安全的单例,简洁、高效、安全。

以上就是C++如何实现单例模式_C++设计模式之Singleton的线程安全实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1485106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 08:38:38
下一篇 2025年12月19日 08:38:47

相关推荐

发表回复

登录后才能评论
关注微信