设计模式之单例模式 (模板 智能指针 删除器) 实现【饿汉】
2016-03-29 16:39
393 查看
上一篇实现的是使用模板 智能指针 删除器的懒汉模式单例。
这一篇实现饿汉模式的版本。
运行结果图:
静态的单例是在主线程(main函数)之前就已经创建好。
当然这个版本还是有问题。 水太深~。。。
参见:Scott Meyers在其《Effective C++》第三版中的04条款的说明:
"
C++标准对于不同的编译单元内的Non-Local-Static对象的初始化相对次序并无明确定义。
如果某一个编译单元内的某个Non-Local-Static对象的初始化,使用了另一个编译单元内的
某个Non-Local-Static对象,它所用到的对象可能尚未被初始化。
"
这一篇实现饿汉模式的版本。
#include <iostream> #include <memory> #include <windows.h> #include <process.h> using namespace std; template <class T> class CEagerSingletonPtr { private: static T m_sg; private: CEagerSingletonPtr(const CEagerSingletonPtr&){} CEagerSingletonPtr& operator=(const CEagerSingletonPtr&){} protected: CEagerSingletonPtr() { cout << "CEagerSingletonPtr begin construct" << endl; ::Sleep(1000); cout << "CEagerSingletonPtr end construct" << endl; } protected: virtual ~CEagerSingletonPtr() { cout << "CEagerSingletonPtr destrcut" << endl; } public: static T& getInstance() { return m_sg; } }; // 类内静态变量初始化 template <class T> T CEagerSingletonPtr<T>::m_sg; // 实例化模板 class EagerManager : public CEagerSingletonPtr<EagerManager> { friend class CEagerSingletonPtr<EagerManager>; protected: EagerManager() { cout << "EagerManager begin construct" << endl; ::Sleep(500); m_count = 0; cout << "EagerManager end construct" << endl; } ~EagerManager() { cout << "EagerManager destrcut" << endl; } public: void print() { cout << "Hello, this is EagerManage " << m_count++ << endl; } private: int m_count; // 私有静态变量 }; unsigned int __stdcall threadFun(void*) { cout << "Current Thread ID = " << ::GetCurrentThreadId() << endl; EagerManager::getInstance().print(); return 0; } void testMultiThread() { for (int i = 0; i < 3; ++i) { uintptr_t th = ::_beginthreadex(NULL, 0, threadFun, NULL, 0, NULL); ::CloseHandle((HANDLE)th); } } int main(void) { cout<<"欢迎进入主线程 ID = "<<::GetCurrentThreadId()<<endl; testMultiThread(); getchar(); return 0; }
运行结果图:
静态的单例是在主线程(main函数)之前就已经创建好。
当然这个版本还是有问题。 水太深~。。。
参见:Scott Meyers在其《Effective C++》第三版中的04条款的说明:
"
C++标准对于不同的编译单元内的Non-Local-Static对象的初始化相对次序并无明确定义。
如果某一个编译单元内的某个Non-Local-Static对象的初始化,使用了另一个编译单元内的
某个Non-Local-Static对象,它所用到的对象可能尚未被初始化。
"
相关文章推荐
- Linux群集LVS简介
- JVM——Java内存区域
- C#去掉HTML标记
- 大数据量分页存储过程效率测试附测试代码与结果
- 基于javascript实现tab切换特效
- 257-e-Binary Tree Paths
- Java垃圾处理机制学习总结
- Storm Trident API实践
- 移动端开发的坑
- POJ 2503 Babelfish
- 线程、同步异步、队列
- php管理工具composer安装&测试
- Android中的跨进程通信的实现(一)——远程调用过程和aidl
- 当transition遇上display
- JQuery选择器大全
- windows环境下通过c++使用redis
- twisted的入门讲解(很不错)
- Spring MVC @Transactional注解方式事务失效的解决办法
- 我们传播云计算---驻云海外云计算培训经验分享
- 输入第几周获取在该年的日期