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

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

在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单例模式的线程安全实现。

 
举报打赏
 
更多>同类物流大全
推荐图文
推荐物流大全
点击排行

网站首页  |  关于我们  |  联系方式 | 网站留言    |  赣ICP备2021007278号