21xrx.com
2025-06-17 16:07:36 Tuesday
登录
文章检索 我的文章 写文章
C++单例模式的线程安全实现
2023-07-04 20:55:45 深夜i     10     0
C++ 单例模式 线程安全 实现

C++单例模式是一种设计模式,它确保一个类只有一个实例,并提供了访问该实例的全局点。但是,在多线程环境下,多个线程同时访问单例实例可能会导致未定义的行为。因此,必须采取措施确保单例的线程安全。

以下是C++单例模式的线程安全实现:

1. 静态变量实现

使用静态变量来实现单例,静态变量只初始化一次,可以保证在整个程序中只有一个实例。但是,如果多个线程同时访问该静态变量,可能会导致未定义的行为。因此,必须使用互斥锁来保护该变量。

示例代码:

#include <mutex>
class Singleton {
private:
  static Singleton* instance;
  static std::mutex mtx;
  Singleton() {}
public:
  static Singleton* getInstance() {
    if (instance == nullptr) {
      std::lock_guard<std::mutex> lock(mtx);
      if (instance == nullptr) {
        instance = new Singleton();
      }
    }
    return instance;
  }
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

2. 函数内部静态变量实现

另一种实现方法是在函数内部定义静态变量。这种方法可以保证只有在第一次调用函数时才会创建实例。但是,在多线程环境下,无法保证该方法的线程安全,因为多个线程可能同时调用该函数。因此,必须使用互斥锁来保护静态变量的初始化。

示例代码:

#include <mutex>
class Singleton {
private:
  Singleton() {}
public:
  static Singleton* getInstance() {
    static Singleton* instance = nullptr;
    static std::mutex mtx;
    std::lock_guard<std::mutex> lock(mtx);
    if (instance == nullptr) {
      instance = new Singleton();
    }
    return instance;
  }
};

以上是C++单例模式的线程安全实现方法。使用上述方法可确保在多线程环境下实现单例模式的线程安全。

  
  

评论区