21xrx.com
2024-12-23 00:53:20 Monday
登录
文章检索 我的文章 写文章
"C++多线程单例模式"
2023-06-27 20:21:29 深夜i     --     --
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++多线程单例模式实现起来比较简单,但是非常实用。通过锁定互斥量,就能够避免多个线程同时创建实例,从而保证单例的正确性。如果你的程序有单例的需求,并且需要在多线程环境中使用,可以考虑这个模式。

  
  

评论区

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