21xrx.com
2025-04-28 14:19:34 Monday
文章检索 我的文章 写文章
"C++多线程单例模式"
2023-06-27 20:21:29 深夜i     26     0
C++ 多线程 单例模式 并发 线程安全

C++多线程单例模式是指在多线程环境下,保证只有一个实例对象存在,并且能够保证线程安全。这个模式在许多应用场合中都非常有用,比如公共资源的存取,全局配置信息的读取等。

在一般的单例模式中,我们往往使用静态变量来实现单例,但是在多线程环境中,这种方法是不安全的。由于多个线程同时访问这个变量,可能会导致多个实例被创建,这就无法保证单例了。

使用C++11的thread_local关键字可以很好地解决这个问题,这个关键字声明的变量是一个线程局部变量,每个线程都有自己独立的一份。但是这个关键字只能保证线程内同步,不能保证全局同步。

因此,在C++11中,我们要使用std::mutex类来同步多个线程之间的访问。这个类定义了锁和解锁的方法,只有在锁定的情况下才能访问对象的实例。

下面是一个C++多线程单例模式的示例代码:

class Singleton {
private:
  static std::mutex mu;
  static Singleton* instance;
  Singleton() {};
public:
  static Singleton* GetInstance() {
    if (instance == nullptr) {
      std::lock_guard<std::mutex> lock(mu);
      if (instance == nullptr) {
        instance = new Singleton();
      }
    }
    return instance;
  }
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mu;
int main() {
  Singleton* singleton1 = Singleton::GetInstance();
  Singleton* singleton2 = Singleton::GetInstance();
  assert(singleton1 == singleton2);
  return 0;
}

在上面的代码中,GetInstance()方法里面使用了std::lock_guard 来保证了线程安全。如果有多个线程同时访问,只有其中一个线程能够通过锁定的检查。

这个C++多线程单例模式实现起来比较简单,但是非常实用。通过锁定互斥量,就能够避免多个线程同时创建实例,从而保证单例的正确性。如果你的程序有单例的需求,并且需要在多线程环境中使用,可以考虑这个模式。

  
  

评论区