#ifndef SINGLETON_H #define SINGLETON_H #ifdef CPP11 #include #include template class Singleton { public: static T& instance() { T * tmp = instance_.load(std::memory_order_consume); if (!tmp) { std::lock_guard guard(instantiation_mutex); tmp = instance_.load(std::memory_order_consume); if (!tmp) { tmp = new T; instance_.store(tmp, std::memory_order_release); } } return *tmp; } private: static std::atomic instance_; static std::mutex instantiation_mutex; }; template std::atomic Singleton::instance_(0); template std::mutex Singleton::instantiation_mutex; #else #include "slmutex.h" template class Singleton { public: static T& instance() { T *tmp = _instance; if (!tmp) { Lockguard guard(&_instantiation_mutex); if (!tmp) { tmp = new T; _instance = tmp; } } return *tmp; } private: static T * _instance; static MutexPosix _instantiation_mutex; }; template T *Singleton::_instance(0); template MutexPosix Singleton::_instantiation_mutex; #endif #endif