阅读量: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_once
和std::once_flag
可以更方便地实现单例模式,可以参考这篇文章:C++11单例模式的线程安全实现。