Sign-up....

关于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++实现中的一个思考

我一般也用第一种,

书上说第二种方法的好处在于你不想用的话,不会创建实例,不占用空间。

线程问题一般不是问题。因为一般程序会在一开始的时候构造吧。

sevencat at 2004-10-19 17:03:32 >
# 2 Re: 关于Singleton模式用C++实现中的一个思考

我能说的上的好处:

1。在概念上,第二种方法更加面向对象,把_instance做成static成员,是OO程序设计的标准方法。

而第一种方法用到了C/C++专有的函数域固定对象,通用性很差。

2。第二种方法可以把对象的销毁操作交给程序员手动控制。

lynnboy at 2004-10-19 17:27:14 >
# 3 Re: 关于Singleton模式用C++实现中的一个思考

不过你要是看看boost里面的两个singleton作法,他们也用的第一种方法。

sevencat at 2004-10-19 17:28:53 >
# 4 Re: 关于Singleton模式用C++实现中的一个思考

至于防止线程读写冲突问题,可以这样:

if ( NULL == _instance++ ) _instance = new Singleton();

_instance++ 基本上为原子操作,可以防止两个线程的访问冲突

lynnboy at 2004-10-19 17:31:05 >
# 5 Re: 关于Singleton模式用C++实现中的一个思考

没大关系啦,基本上是风格问题,没有什么效率或语义差别

lynnboy at 2004-10-19 17:32:45 >
# 6 Re: 关于Singleton模式用C++实现中的一个思考

_instance++还不是原子操作。

interlockedincrease确保是原子操作。

sevencat at 2004-10-19 18:14:21 >
# 7 Re: 关于Singleton模式用C++实现中的一个思考

请再思考一个问题,我是忽然想到的。

第一种方法中static Singleton s;

这一句话是不是原子操作?存在线程同步问题吗??

wildhorseych at 2004-10-20 8:11:52 >
# 8 Re: 关于Singleton模式用C++实现中的一个思考

第一种方法在有互相依赖的几个Singleton class时会有问题.这在新思维中有说明.

static Singleton s;在多线程连接中应该是原子操作--如果厂商有思考的话

yjh1982 at 2004-10-20 8:29:14 >
# 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也不存在了.

yjh1982 at 2004-10-20 9:13:42 >
# 12 Re: 关于Singleton模式用C++实现中的一个思考

多线程环境下使用singleton的时候用第二种方法是可以使用double check来避免死锁问题。

其实singleton的一个最主要的好处就是可以lazy init,而这时第二种方式才能实现的

Polarislee at 2004-10-20 9:53:47 >
# 13 Re: 关于Singleton模式用C++实现中的一个思考

1。请哪位高手讲讲第一种方法具体怎么样情况会导致无法析构

2。请北极星讲讲在C++中具体怎么样使用double check

大家共同学习啊,小弟分数实在有限,请各位多多包涵!

wildhorseych at 2004-10-20 10:11:30 >
# 14 Re: 关于Singleton模式用C++实现中的一个思考

3。另外,lazy init很吸引人吗??它带来什么具体好处?

wildhorseych at 2004-10-20 10:12:41 >
# 15 Re: 关于Singleton模式用C++实现中的一个思考

懒惰算法是一种重要的性能优化方案.

yjh1982 at 2004-10-20 13:04:23 >
# 16 Re: 关于Singleton模式用C++实现中的一个思考

关于singleton模式的double-checked locking,虽然使用Java写的,不过看懂应该没有问题

http://www-106.ibm.com/developerworks/java/library/j-dcl.html

Polarislee at 2004-10-20 14:54:07 >

C/C++

All Classified