21xrx.com
2024-09-20 00:55:21 Friday
登录
文章检索 我的文章 写文章
C++单例模式之变量加锁
2023-07-01 13:00:27 深夜i     --     --
C++ 单例模式 变量 加锁 锁定变量

在C++中,单例模式被用来确保一个类只能创建一个实例,这对于某些需要共享或者只需要一个实例的对象非常有用。然而,在多线程环境下,单例模式就会面临一些问题,例如多个线程同时调用getInstance()函数可能会导致类被多次实例化。

为了解决这个问题,我们可以在getInstance()函数中添加锁定机制,确保在同一时间只能有一个线程创建实例。其中最常用的方法是使用互斥量(mutex)进行加锁和解锁操作。

下面是一个使用互斥量实现单例模式的示例代码:


#include <mutex>

class Singleton {

public:

  static Singleton& getInstance() {

    std::lock_guard<std::mutex> lock(mutex_); // 加锁

    if (instance_ == nullptr) {

      instance_ = new Singleton();

    }

    return *instance_;

  }

  Singleton(const Singleton&) = delete;

  Singleton& operator=(const Singleton&) = delete;

private:

  Singleton() {}

  ~Singleton() {}

  static Singleton* instance_;

  static std::mutex mutex_;

};

Singleton* Singleton::instance_ = nullptr;

std::mutex Singleton::mutex_;

在上面的代码中,getInstance()函数在创建实例之前使用std::lock_guard lock(mutex_);对mutex_进行加锁操作,这样保证了同时只有一个线程可以创建实例。如果已经有一个实例存在,则直接返回该实例。

需要注意的是,在多线程环境下,加锁和解锁操作也会带来一定的性能开销,因此应该尽量避免过度使用锁定。

总之,使用互斥量加锁是实现单例模式在多线程环境下的一种常用方法,在使用时需要注意线程安全和性能方面的平衡。

  
  

评论区

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