关于Singleton模式用C++实现中的一个思考
大家都知道,在用C++来实现Singleton模式的时候通常把构造函数声明为私有的或者保护的。同时声明一个公有的静态的伪构造函数,通过它来调用真正的构造函数。在实现这个伪构造函数的时候通常有两种方式:
class Singleton;
static Singleton& Singleton:;fakeSingleton()
{
static Singleton s;
return s;
}
第二种方式:
class Singleton{
public:
static Singleton* fakeSingleton();
...
private:
Singleton();
static Singleton * _instance;
}
Singleton* Singleton::fakesinketon()
{
if( _instance==NULL)
_instance=new Singleton();
return _instance;
}
对于这两种方式我觉得第一种更好一些,理由是,如果有两个以上的线程同时访问伪构造函数的时候有可能同时进入if 控制块,这样就有可能产生两个实例!!因此必须采用特殊的保护机制来控制同步。而第一种方式不存在这样的问题。
请高手指点!我不明白的是,为什么书上的例子还较多的采用第二种方法?莫非它有自己的优势??
[609 byte] By [
msdn] at [2007-8-14 13:07:55]

# 1 Re: 关于Singleton模式用C++实现中的一个思考
我一般也用第一种,
书上说第二种方法的好处在于你不想用的话,不会创建实例,不占用空间。
线程问题一般不是问题。因为一般程序会在一开始的时候构造吧。
# 2 Re: 关于Singleton模式用C++实现中的一个思考
我能说的上的好处:
1。在概念上,第二种方法更加面向对象,把_instance做成static成员,是OO程序设计的标准方法。
而第一种方法用到了C/C++专有的函数域固定对象,通用性很差。
2。第二种方法可以把对象的销毁操作交给程序员手动控制。
# 3 Re: 关于Singleton模式用C++实现中的一个思考
不过你要是看看boost里面的两个singleton作法,他们也用的第一种方法。
# 4 Re: 关于Singleton模式用C++实现中的一个思考
至于防止线程读写冲突问题,可以这样:
if ( NULL == _instance++ ) _instance = new Singleton();
_instance++ 基本上为原子操作,可以防止两个线程的访问冲突
# 5 Re: 关于Singleton模式用C++实现中的一个思考
没大关系啦,基本上是风格问题,没有什么效率或语义差别
# 6 Re: 关于Singleton模式用C++实现中的一个思考
_instance++还不是原子操作。
interlockedincrease确保是原子操作。
# 7 Re: 关于Singleton模式用C++实现中的一个思考
请再思考一个问题,我是忽然想到的。
第一种方法中static Singleton s;
这一句话是不是原子操作?存在线程同步问题吗??
# 8 Re: 关于Singleton模式用C++实现中的一个思考
第一种方法在有互相依赖的几个Singleton class时会有问题.这在新思维中有说明.
static Singleton s;在多线程连接中应该是原子操作--如果厂商有思考的话
# 9 Re: 关于Singleton模式用C++实现中的一个思考
static Singleton s;
由于效率的原因,
一般不是原子操作。
iicup at 2004-10-20 8:35:13 >

# 10 Re: 关于Singleton模式用C++实现中的一个思考
to yjh1982(血精灵)
第一种方法在有互相依赖的几个Singleton class时会有问题.这在新思维中有说明.
********************************************************************
能不能多解释一下?
另外,我把第一种方法中fakeSingleton的static去掉,如下,会出现什么情况呢??
static Singleton& Singleton:;fakeSingleton()
{
//static
Singleton s;
return s;
}
tsohg at 2004-10-20 9:06:04 >

# 11 Re: 关于Singleton模式用C++实现中的一个思考
我记不清了:(好象是三个类在析购中互相依赖导致不能结束
把static去掉就会完蛋.函数结束时s也不存在了.
# 12 Re: 关于Singleton模式用C++实现中的一个思考
多线程环境下使用singleton的时候用第二种方法是可以使用double check来避免死锁问题。
其实singleton的一个最主要的好处就是可以lazy init,而这时第二种方式才能实现的
# 13 Re: 关于Singleton模式用C++实现中的一个思考
1。请哪位高手讲讲第一种方法具体怎么样情况会导致无法析构
2。请北极星讲讲在C++中具体怎么样使用double check
大家共同学习啊,小弟分数实在有限,请各位多多包涵!
# 14 Re: 关于Singleton模式用C++实现中的一个思考
3。另外,lazy init很吸引人吗??它带来什么具体好处?
# 15 Re: 关于Singleton模式用C++实现中的一个思考
懒惰算法是一种重要的性能优化方案.
# 16 Re: 关于Singleton模式用C++实现中的一个思考
关于singleton模式的double-checked locking,虽然使用Java写的,不过看懂应该没有问题
http://www-106.ibm.com/developerworks/java/library/j-dcl.html