单例模式通过私有构造函数和静态成员确保类唯一实例,C++中常用Meyers' Singleton(线程安全、简洁)或双重检查锁(延迟加载、高效)实现,前者推荐优先使用。

单例模式确保一个类只有一个实例,并提供一个全局访问点。实现的关键在于控制实例的创建,通常通过私有化构造函数和静态成员变量来实现。
解决方案:
C++中实现单例模式有多种方法,以下提供几种常见的实现方式:
1. 懒汉式(线程不安全)
立即学习“C++免费学习笔记(深入)”;
class Singleton {
private:
Singleton() {} // 私有构造函数
static Singleton* instance;
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; // 静态成员变量初始化这种方式在第一次调用
getInstance()
if (instance == nullptr)
2. 懒汉式(线程安全,但效率较低)
#include <mutex>
class Singleton {
private:
Singleton() {}
static Singleton* instance;
static std::mutex mutex;
public:
static Singleton* getInstance() {
std::lock_guard<std::mutex> lock(mutex);
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;使用
std::mutex
getInstance()
3. 饿汉式(线程安全)
class Singleton {
private:
Singleton() {}
static Singleton* instance;
public:
static Singleton* getInstance() {
return instance;
}
};
Singleton* Singleton::instance = new Singleton(); // 在程序启动时创建实例在程序启动时就创建实例,线程安全,但可能造成资源浪费,如果实例一直没有被使用。
4. Double-Checked Locking(双重检查锁,C++11 之后推荐)
#include <mutex>
#include <atomic>
class Singleton {
private:
Singleton() {}
static std::atomic<Singleton*> instance;
static std::mutex mutex;
public:
static Singleton* getInstance() {
Singleton* tmp = instance.load(std::memory_order_relaxed);
if (tmp == nullptr) {
std::lock_guard<std::mutex> lock(mutex);
tmp = instance.load(std::memory_order_relaxed);
if (tmp == nullptr) {
tmp = new Singleton();
instance.store(tmp, std::memory_order_release);
}
}
return tmp;
}
};
std::atomic<Singleton*> Singleton::instance;
std::mutex Singleton::mutex;这种方式结合了懒汉式和线程安全,只有在实例未创建时才加锁。使用
std::atomic
std::memory_order_relaxed
std::memory_order_release
5. Meyers' Singleton (C++11 推荐)
class Singleton {
private:
Singleton() {}
Singleton(const Singleton&); // Deleted.
Singleton& operator=(const Singleton&); // Deleted.
public:
static Singleton& getInstance() {
static Singleton instance; // 局部静态变量,C++11保证线程安全
return instance;
}
};利用C++11标准中局部静态变量的线程安全特性,这是最简洁、最推荐的单例模式实现方式。 避免了手动管理锁,代码简洁,易于理解。
单例模式在多线程环境下如何保证线程安全?
上述代码示例中,提供了多种保证线程安全的方式。 核心思路是使用互斥锁(
std::mutex
std::atomic
单例模式有哪些优缺点?
优点:
缺点:
如何选择合适的单例模式实现方式?
选择单例模式的实现方式需要考虑以下因素:
通常情况下,推荐使用 Meyers' Singleton,除非有特殊需求(例如延迟加载),才考虑其他实现方式。
以上就是c++++如何实现单例模式_c++设计模式之单例模式实现方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号