需求

在写硬件驱动的时候,有些串口之类的硬件,适合独占访问,适合用单例模式去实现,那么 c++ 中如何实现单例呢?

解决

c++ 17 中拓展了 inline 变量,可以在类内部直接初始化静态变量,这样就方便实现单例模式。如果是需要在多线程情况下使用,那么还可以使用 std::once_flag, std::call_once() 之类的来确保只初始化一次,使用 once 之类的需要引入头文件 <mutex .

/*
 * 多线程条件下只执行一次
 * once_flag的生命周期。它必需要比使用它的线程的生命周期要长。所以通常定义成全局变量比較好。
 */
static  std::once_flag init_flag;
// 单例模式
class singleton_pattern
{
private:

      inline static singleton_pattern* _instance_ptr{nullptr};// C++ 17 inline static 直接初始化


private:
      singleton_pattern()
      {
	      cout << "constructor called" << endl;
      }

      singleton_pattern(singleton_pattern&) = delete;
      singleton_pattern& operator=(const singleton_pattern&) = delete;


public:
      ~singleton_pattern()
      {
	      cout << "destructor called" << endl;
      }

      static singleton_pattern* get_instance()
      {


	      std::call_once(init_flag, []()
		      {
			      if (_instance_ptr == nullptr)
				      _instance_ptr = new singleton_pattern;
		      });
	      return _instance_ptr;
      }

      void print_addr()
      {
	      cout << std::format("address: {} \n", (void*)_instance_ptr);
      }

};

参考

C++ 17 inline static 实现单例模式

std::call_once 函数详解

error: ‘once_flag’ in namespace ‘std’ does not name a type

std::once_flag