21xrx.com
2024-09-20 00:49:22 Friday
登录
文章检索 我的文章 写文章
C++线程安全单例模式实现
2023-06-29 20:29:41 深夜i     --     --
C++ 线程安全 单例模式 实现

在多线程编程中,单例模式是一种非常常见的设计模式,它可以保证在整个程序中只存在唯一的实例,从而避免一些由于对象的重复创建和管理而带来的问题。但是在多线程环境下,单例模式需要保证线程安全才能保证正常工作。在本文中,我们将介绍如何使用C++语言实现线程安全的单例模式。

1. 懒汉式线程安全单例模式

懒汉式单例模式指的是,在需要使用单例对象时才会创建对象的方法。对于一个单例模式的实现,我们可以使用指针变量来记录对象,当需要使用对象时,判断指针是否为空,如果为空,则创建对象并将对象地址赋给指针变量。在单线程环境下,这种方式是非常安全和可行的,但是在多线程环境下,可能会出现两个线程同时判断指针为空的情况,从而两个线程同时创建了对象,导致产生多个对象从而破坏了单例的约束。

为了避免上述问题,我们可以在函数内部添加锁机制,确保在同一时刻只有一个线程能够创建对象,如下代码所示:


class Singleton{

 private:

  static Singleton* pInstance;

  static std::mutex mutex_;

 public:

  static Singleton* getInstance(){

    if (pInstance == nullptr){

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

      if (pInstance == nullptr){

        pInstance = new Singleton();

      }

    }

    return pInstance;

  } 

};

在上述代码中,我们使用了`mutex_`互斥锁来保证在同步块中只能有一个线程进行创建。由于C++11开始支持了锁语法,因此我们可以直接使用`std::mutex`类型的锁来进行互斥操作,同时使用`lock_guard`自动锁定和解锁,从而避免忘记解锁的错误。

2. 饿汉式线程安全单例模式

在饿汉式单例模式中,单例对象是在程序启动时就进行初始化的,这种方式避免了线程安全问题,因为对象只有一个,并且在多线程环境下也没有竞争的问题。

下面是饿汉式线程安全单例模式的代码实现:


class Singleton{

 private:

  static Singleton* pInstance;

  Singleton()

    //构造函数被设为私有

 public:

  static Singleton* getInstance()

    return pInstance;

  

};

Singleton* Singleton::pInstance = new Singleton();

在上述代码中,我们将构造函数设为private,确保外部无法调用构造函数来进行创建对象。同时,我们直接在类声明外部进行了单例对象的初始化,因此对象只有一个,而且在多线程环境下也不会存在竞争的问题。

3. 总结

本文介绍了如何使用C++语言实现线程安全的单例模式,包括懒汉式和饿汉式两种实现方式。通过加锁机制来保证只有一个线程能够创建对象,或是在程序启动时就进行对象的初始化,从而避免多个线程同时创建对象的问题。在实际编程过程中,根据具体需求和场景选择适合的实现方式是非常重要的。

  
  

评论区

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