#pragma once /** * @file SingletonTemp.hpp * @brief 单例模式 模板类 加锁 * @author your name (you@domain.com) * @version 0.1 * @date 2023-12-22 * * Copyright: Baosight Co. Ltd. * DO NOT COPY/USE WITHOUT PERMISSION * */ #include #include // namespace { // std::mutex local_mutex; // } template class SingletonTemp { private: static std::mutex &get_mutex() { static std::mutex instance_mutex; // 每个类型有自己的静态mutex return instance_mutex; } protected: SingletonTemp(); public: virtual ~SingletonTemp(void); static T *GetInstancePtr(); static T &GetInstance(); static bool release(void); private: static T *mp_singleton; }; template T *SingletonTemp::mp_singleton = nullptr; template SingletonTemp::SingletonTemp(void) {} template SingletonTemp::~SingletonTemp(void) { release(); } template T *SingletonTemp::GetInstancePtr() { // std::lock_guard guard(local_mutex); std::lock_guard guard(get_mutex()); // 使用类型特定的锁 if (mp_singleton == nullptr) { mp_singleton = new T(); } return mp_singleton; } template T &SingletonTemp::GetInstance() { // std::lock_guard guard(local_mutex); std::lock_guard guard(get_mutex()); // 使用类型特定的锁 if (mp_singleton == nullptr) { mp_singleton = new T(); } return *mp_singleton; } template bool SingletonTemp::release(void) { // std::lock_guard guard(local_mutex); std::lock_guard guard(get_mutex()); // 使用类型特定的锁 bool rtc = true; if (mp_singleton != nullptr) { delete mp_singleton; mp_singleton = nullptr; } return rtc; }