Singleton(17)
2013-11-07 09:08
246 查看
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
[/code]
测试程序:
#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()); }
[/code]
程序输出:
[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]#
相关文章推荐
- Hadoop 2.2.0正式版特性分析
- Android 4.4 WebView重大改动:由Chromium驱动 支持HTML5和CSS新特性
- Java IO--BufferedReader
- 实验9指针1
- codereviw得到的一些经验
- Linux新手要了解的十个知识点
- ThreadPool(16)
- Tomacat7启动报错-org.apache.catalina.deploy.WebXml addFilter的解决方法
- JS读取cookie(记住账号密码)
- WordPress已占全球网站平台18.9%的份额
- JavaScript
- [LeetCode] Search for a Range
- javascript 注入实现跨html跨浏览器传参
- BoundedBlockingQueue
- 内核的输入子系统
- Linux之#pragma的用法
- STL容器是否是线程安全的
- linux文件系统基础知识
- 如何实现虚拟机和宿主的SSH通信
- vmlinux的构建过程