问题描述
- 多线程下Singleton模式
-
//singleton.h #ifndef _SINGLETON_H_ #define _SINGLETON_H_ #include "synobj.h" template<typename T> class Singleton { public: static T* Instance(); protected: private: Singleton(); ~Singleton(); Singleton(Singleton& ); Singleton& operator = (Singleton& ); static void Destory(); private: static T* _instance; static Mutex _mutex; };
//singleton.cpp //volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值. #include "stdafx.h" #include "singleton.h" #include <iostream> #include <stdlib.h> using namespace std; template<typename T> T* Singleton<T>::_instance = NULL; template<typename T> Mutex Singleton<T>::_mutex; template<typename T> Singleton<T>::Singleton() { } template<typename T> Singleton<T>::~Singleton() { } template<typename T> T* Singleton<T>::Instance() { if(_instance == NULL ) { Lock lock(_mutex); if(_instance == NULL) { T* temp = new T; _instance = temp; //_instance = new T(); atexit(Destory); } } return _instance; } template<typename T> void Singleton<T>::Destory() { if(NULL != _instance) { delete _instance; _instance = NULL; } }
// Singleton20.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "singleton.h" #include "synobj.h" #include <stdio.h> #include <iostream> using namespace std; class A:public Singleton<A> { public: void DoSomething() { cout<<"hello DoSomething"<<endl; } }; int _tmain(int argc, _TCHAR* argv[]) { A* a = A::Instance(); a->DoSomething(); getchar(); return 0; }
解决方案
用模板类的实现应该写在.h里面,最好是将.h命名成.hpp,你看看boost里面的头文件基本都是.hpp
这个其实是因为模板在编译的时候并没有实例化,看下这个文章吧c++模板类(一)理解编译器的编译模板过程
解决方案二:
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&id=4281275&uid=26611383
解决方案三:
http://blog.csdn.net/scutth/article/details/7997685
解决方案四:
vs应该不支持模版分离,你把模版定义,实现都放在一起。
解决方案五:
http://www.cnblogs.com/08shiyan/archive/2012/03/16/2399617.html
解决方案六:
你用的什么编译器版本,VC6? 请用最新的编译器VS2012等。老版本编译器有问题。
然后就是析构函数最好用虚函数
virtual ~Singleton(){};
解决方案七:
SingleTon模式的多线程环境
多线程Singleton单件模式
多线程Singleton单件模式
解决方案八:
我来顶一下,各位前辈帮忙看看吧。。。。。
解决方案九:
将声明和定义都放在一起后,发现还是有一个小小的问题,不知道为什么?请大家帮忙再看一下吧
//singleton.h
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include "synobj.h"
#include <stdlib.h>
template<typename T>
class Singleton
{
public:
static T* Instance()
{
if(NULL == _instance)
{
Lock lock(_mutex);
if(NULL == _instance)
{
T* temp = new T;
_instance = temp;
atexit(Destory);
}
}
return _instance;
}
protected:
private:
Singleton(){}
~Singleton(){}
Singleton(Singleton& ){}
Singleton& operator = (Singleton& ){}
static void Destory()
{
if(NULL != _instance)
{
delete _instance;
_instance = NULL;
}
}
private:
static T* _instance;
static Mutex _mutex;
};
template<typename T> T* Singleton<T>::_instance = NULL;
template<typename T> Mutex Singleton<T>::_mutex;
// Singleton20.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "singleton.h"
#include "synobj.h"
#include <stdio.h>
#include <iostream>
using namespace std;
class A:public Singleton<A>
{
public:
void DoSomething()
{
cout<<"hello DoSomething"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* a = A::Instance();
a->DoSomething();
getchar();
return 0;
}
解决方案十:
将类模板的构造函数和析构函数的声明和定义放在public下面,就可以测试通过了,可是这是为什么呢?
时间: 2024-08-31 01:29:19