21xrx.com
2024-11-08 21:58:26 Friday
登录
文章检索 我的文章 写文章
C++单例模式的线程安全实现
2023-07-04 20:55:45 深夜i     --     --
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++单例模式的线程安全实现方法。使用上述方法可确保在多线程环境下实现单例模式的线程安全。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复