21xrx.com
2024-09-20 00:47:30 Friday
登录
文章检索 我的文章 写文章
C++多线程下的单例模式实现
2023-07-07 11:16:04 深夜i     --     --
C++ 多线程 单例模式 实现 线程安全

在多线程的环境下,单例模式的实现需要考虑线程安全问题。C++多线程下的单例模式实现可以通过以下方式实现:

1. 使用静态变量

使用静态变量作为单例对象,可以保证在程序运行期间只有一个对象被创建。但是在多线程情况下,多个线程可能同时调用创建单例对象的方法,导致多个对象被创建。为了避免这种情况,可以在方法中加锁,保证只有一个线程能够创建对象。

例如:

 c++

class Singleton {

private:

  Singleton();

  static Singleton* instance;

public:

  static Singleton* getInstance() {

    if (instance == nullptr) {

      std::lock_guard<std::mutex> lock(mutex);

      if (instance == nullptr) {

        instance = new Singleton();

      }

    }

    return instance;

  }

  // other methods and variables...

};

Singleton* Singleton::instance = nullptr;

std::mutex Singleton::mutex;

上面的代码中,使用了 `std::lock_guard` 对象实现了 RAII(Resource Acquisition Is Initialization,资源获取即初始化)技术,保证在代码块中加锁,离开代码块时自动解锁。

2. 使用双重检查锁定

双重检查锁定(Double-Checked Locking)是一种常用的线程安全的单例模式实现方式。在方法中使用两次检查,第一次判断对象是否已经被创建,如果没有则进入锁定代码块创建对象。第二次判断对象是否已经被创建,如果没有则创建对象并返回。

例如:

 c++

class Singleton {

private:

  Singleton();

  static Singleton* instance;

  static std::mutex mutex;

public:

  static Singleton* getInstance() {

    if (instance == nullptr) {

      std::lock_guard<std::mutex> lock(mutex);

      if (instance == nullptr) {

        instance = new Singleton();

      }

    }

    return instance;

  }

  // other methods and variables...

};

Singleton* Singleton::instance = nullptr;

std::mutex Singleton::mutex;

上面的代码中,使用了两次判断来保证线程安全,第一次判断 `instance` 是否为空,如果为空则进入锁定代码块。在锁定代码块中再次判断 `instance` 是否为空,如果为空则创建对象并赋值给 `instance`。

总结

C++多线程下的单例模式实现需要考虑线程安全问题,一般使用静态变量或双重检查锁定来保证线程安全。在使用锁定时要注意使用 RAII 技术保证锁定的正确使用。为了提高代码效率和可读性,建议使用标准库提供的 `std::mutex` 来实现锁定。

  
  

评论区

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