#ifndef _H_LPSINGLETON_H_ #define _H_LPSINGLETON_H_ #include #include template class lpsingleton { 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: lpsingleton() = default; virtual ~lpsingleton() = default; private: lpsingleton(const T&) = delete; T& operator=(const T&) = delete; static std::atomic s_this; static std::mutex s_mutex; }; template std::atomic lpsingleton::s_this; template std::mutex lpsingleton::s_mutex; #endif