Singleton class uml
Singleton源代码
// Use of this source code is governed by a BSD-style license // that can be found in the License file. // // Author: Shuo Chen (chenshuo at chenshuo dot com) #ifndef MUDUO_BASE_SINGLETON_H #define MUDUO_BASE_SINGLETON_H #include <boost/noncopyable.hpp> #include <pthread.h> #include <stdlib.h> // atexit namespace muduo { template<typename T> class Singleton : boost::noncopyable //不可复制的 { public: static T& instance() //单例一个对象 { pthread_once(&ponce_, &Singleton::init); //线程安全,并且一次调用 return *value_; } private: Singleton(); ~Singleton(); //初始化对象value static void init() { value_ = new T(); //加入释放队列 ::atexit(destroy); } static void destroy() { //T_must_be_complete_type 完全类型 typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1]; //真正释放实例资源 delete value_; } private: static pthread_once_t ponce_; static T* value_; }; template<typename T> pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT; template<typename T> T* Singleton<T>::value_ = NULL; } #endif
测试程序:
#include <muduo/base/Singleton.h> #include <muduo/base/CurrentThread.h> #include <muduo/base/Thread.h> #include <boost/noncopyable.hpp> #include <stdio.h> class Test : boost::noncopyable { public: Test() { printf("tid=%d, constructing %p\n", muduo::CurrentThread::tid(), this); } ~Test() { printf("tid=%d, destructing %p %s\n", muduo::CurrentThread::tid(), this, name_.c_str()); } const muduo::string& name() const { return name_; } void setName(const muduo::string& n) { name_ = n; } private: muduo::string name_; }; void threadFunc() { printf("tid=%d, %p name=%s\n", muduo::CurrentThread::tid(), &muduo::Singleton<Test>::instance(), muduo::Singleton<Test>::instance().name().c_str()); muduo::Singleton<Test>::instance().setName("only one, changed"); } int main() { //muduo::Singleton<Test>::instance() 单例化 Test muduo::Singleton<Test>::instance().setName("only one"); muduo::Thread t1(threadFunc); t1.start(); t1.join(); printf("tid=%d, %p name=%s\n", muduo::CurrentThread::tid(), &muduo::Singleton<Test>::instance(), muduo::Singleton<Test>::instance().name().c_str()); }
程序输出:
[root@localhost bin]# ./singleton_test
tid=2777, constructing 0x87cc008
tid=2778, 0x87cc008 name=only one
tid=2777, 0x87cc008 name=only one, changed
tid=2777, destructing 0x87cc008 only one, changed
[root@localhost bin]#