当前位置:实例文章 » HTML/CSS实例» [文章]C++ 单例模式(介绍+实现)

C++ 单例模式(介绍+实现)

发布人:shili8 发布时间:2025-02-10 17:39 阅读次数:0

**C++ 单例模式**

###什么是单例模式?

单例模式是一种设计模式,它确保一个类在整个程序生命周期中只有一个实例。这个实例可以被多个线程或函数访问。

### 为什么需要单例模式?

在某些情况下,我们可能需要保证一个类的实例只有一份,这样可以避免资源浪费、减少内存占用等问题。例如,日志记录器、配置文件读取器等都可以使用单例模式来实现。

### 单例模式的实现####1. 线程不安全的实现

cppclass Singleton {
public:
 static Singleton* getInstance() {
 if (instance == nullptr) {
 instance = new Singleton();
 }
 return instance;
 }

private:
 Singleton() {}
 ~Singleton() {}

 static Singleton* instance;
};


在这个例子中,我们使用一个静态指针来存储实例。每次调用 `getInstance()` 方法时,会检查实例是否已经存在,如果不存在,就创建一个新的实例。

####2. 线程安全的实现(使用锁)

cppclass Singleton {
public:
 static Singleton* getInstance() {
 if (instance == nullptr) {
 std::lock_guard<std::mutex> lock(mutex);
 if (instance == nullptr) {
 instance = new Singleton();
 }
 }
 return instance;
 }

private:
 Singleton() {}
 ~Singleton() {}

 static Singleton* instance;
 static std::mutex mutex;
};


在这个例子中,我们使用一个互斥锁来保证线程安全。每次调用 `getInstance()` 方法时,会先获取锁,然后检查实例是否已经存在,如果不存在,就创建一个新的实例。

####3. 线程安全的实现(使用原子指针)

cppclass Singleton {
public:
 static Singleton* getInstance() {
 if (instance == nullptr) {
 std::atomic atomicInstance(instance);
 while (true) {
 Singleton* current = atomicInstance.load();
 if (current != nullptr || !atomicInstance.compare_exchange_strong(current, new Singleton())) {
 break;
 }
 }
 }
 return instance;
 }

private:
 Singleton() {}
 ~Singleton() {}

 static std::atomic instance;
};


在这个例子中,我们使用一个原子指针来保证线程安全。每次调用 `getInstance()` 方法时,会先检查实例是否已经存在,如果不存在,就创建一个新的实例。

### 总结单例模式是一种常见的设计模式,它可以保证一个类的实例只有一份。在实现中,我们需要考虑到线程安全的问题,并选择合适的方法来解决这个问题。使用锁、原子指针等技术都可以实现线程安全的单例模式。

### 参考* 《C++ Primer》第5 版* 《Effective C++》第3 版* 《Modern C++ Design》第1 版

其他信息

其他资源

Top