#ifndef _H_LP_SINGLETON_BASE_H_ #define _H_LP_SINGLETON_BASE_H_ #include #include template class lp_singleton_base { public: static T* instance() { T *sin = s_this.load(std::memory_order_acquire); if (!sin) { std::lock_guard locker(s_mutex); sin = s_this.load(std::memory_order_relaxed); if (!sin) { sin = new T; s_this.store(sin, std::memory_order_release); } } return sin; } static void uninstance() { T *sin = s_this.load(std::memory_order_relaxed); if (sin) { std::lock_guard locker(s_mutex); delete sin; sin = nullptr; } } protected: lp_singleton_base() = default; virtual ~lp_singleton_base() = default; private: lp_singleton_base(const T&) = delete; T& operator=(const T&) = delete; static std::atomic s_this; static std::mutex s_mutex; }; template std::atomic lp_singleton_base::s_this; template std::mutex lp_singleton_base::s_mutex; #endif