21xrx.com
2025-03-25 22:53:34 Tuesday
文章检索 我的文章 写文章
C++编写线程安全的单例模式
2023-07-06 08:52:39 深夜i     --     --
C++ 线程安全 单例模式 多线程 互斥锁

在多线程环境下,单例模式的使用非常常见。但是C++的单例模式在默认情况下是不线程安全的,因此需要特别处理。

线程安全的单例模式基本实现原理如下:

首先,我们需要在单例类中定义一个静态的私有成员指针和一个静态的互斥量,用来存储唯一的实例和保证线程的安全。在获取单例实例时,要先锁定互斥量,然后判断指针是否为空,如果为空,就创建一个实例,并令指针指向该实例;否则,直接返回已有的实例。最后,一定要记得在使用完单例实例后释放互斥量。

下面是一个C++线程安全的单例模式的代码实现:

class Singleton
{
private:
  static Singleton* instance;
  static mutex mtx;
  Singleton(){}
public:
  static Singleton* getInstance()
  {
    // 先锁定互斥量
    mtx.lock();
    if(instance == NULL)
    {
      instance = new Singleton();
    }
    // 使用完后释放互斥量
    mtx.unlock();
    return instance;
  }
  static void destroyInstance()
  {
    // 先锁定互斥量
    mtx.lock();
    if(instance != NULL)
    
      delete instance;
      instance = NULL;
    
    // 使用完后释放互斥量
    mtx.unlock();
  }
};
Singleton* Singleton::instance = NULL;
mutex Singleton::mtx;

在上述代码中,mutex为C++11引入的线程安全的互斥量,可以保证线程的安全。

使用单例模式时,只需调用Singleton类的getInstance()函数获取单例实例即可,如下所示:

Singleton* obj1 = Singleton::getInstance();
Singleton* obj2 = Singleton::getInstance();

obj1和obj2是同一个实例,因为getInstance()函数只有在instance为空的情况下才会创建一个新实例,否则都返回已有的实例。

最后,一定要记得在程序结束时调用Singleton::destroyInstance()函数释放已创建的单例对象,避免内存泄漏。

  
  

评论区