c++ 11 的单例模式


概述

在开发过程中,Singleton 是一个非常常用的模式,例如,系统配置、内存管理等全局唯一的实例都需要使用单例。

在 C++ 11 之前,实现一个线程安全的单例需要一些特别的 trick。本文介绍 C++ 11 之后的实现方式,非常的简单。

实现

实现的关键点:

  • 构造函数设置为 private
  • 拷贝和移动的构造和赋值函数也都移除,设置为 delete
  • static GetInstance 方法来获取其实例
  • 在 GetInstance 方法中,使用 static local variables 来初始化 instance

这里主要使用的就是 C++ 11 中对于 static local variables 的明确定义:

If multiple threads attempt to initialize the same static local variable concurrently, the initialization occurs exactly once.

这样就保证了其线程安全,极大简化了单例的实现。

实现代码如下:

#include "gtest/gtest.h"

class Singleton {
public:
    static Singleton* GetInstance() {
        static Singleton* instance = new Singleton;
        return instance;
    }

private:
    Singleton() = default;
    ~Singleton() = default;

    Singleton(const Singleton&) = delete;
    Singleton(Singleton&&) = delete;
    Singleton& operator=(const Singleton&) = delete;
    Singleton& operator=(Singleton&&) = delete;
};

TEST(SingletonTest, BasicTest) {
    // singleton test
    Singleton* singleton_a = Singleton::GetInstance();
    Singleton* singleton_b = Singleton::GetInstance();
    ASSERT_EQ(singleton_a, singleton_b);

    // cannot create a new instance in constructor
    // Singleton s;
}

参考资料

  1. Modern C++ Singleton Template
  2. C++ 单例模式 Singleton

如果觉得文章对您有帮助,用微信请作者喝杯咖啡吧!这样他会更有动力,分享更多更好的知识!

wechat赞赏
 Toc