C++单例类如何实现多线程安全

avatar
作者
筋斗云
阅读量:0

在C++中实现多线程安全的单例类通常使用双检锁机制(Double-Checked Locking Pattern)来确保只有一个实例被创建。下面是一个使用双检锁机制实现多线程安全的单例类的示例代码:

#include <iostream> #include <mutex>  class Singleton { public:     static Singleton* getInstance() {         if (instance == nullptr) {             std::lock_guard<std::mutex> lock(mutex);             if (instance == nullptr) {                 instance = new Singleton();             }         }         return instance;     }  private:     Singleton() {}     Singleton(const Singleton&) = delete;     Singleton& operator=(const Singleton&) = delete;      static Singleton* instance;     static std::mutex mutex; };  Singleton* Singleton::instance = nullptr; std::mutex Singleton::mutex;  int main() {     Singleton* singleton1 = Singleton::getInstance();     Singleton* singleton2 = Singleton::getInstance();      std::cout << "singleton1 address: " << singleton1 << std::endl;     std::cout << "singleton2 address: " << singleton2 << std::endl;      return 0; } 

在上面的示例中,getInstance函数使用双检锁机制,在第一次调用时检查instance是否为nullptr,如果是,则使用std::lock_guard<std::mutex>mutex进行加锁,然后再次检查instance是否为nullptr,如果是,则创建一个新的Singleton实例。这样可以确保在多线程环境下只有一个实例被创建。

需要注意的是,C++11及以上的标准库中提供了std::call_oncestd::once_flag可以更方便地实现单例模式,可以参考这篇文章:C++11单例模式的线程安全实现

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!