需求
在写硬件驱动的时候,有些串口之类的硬件,适合独占访问,适合用单例模式去实现,那么 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);
}
};