http://www.cppblog.com/dyj057/archive/2005/09/20/346.html
大家都知道,在用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 控制块,这样就有可能产生两个实例!!因此必须采用特殊的保护机制来控制同步。而第一种方式不存在这样的问题。
请高手指点!我不明白的是,为什么书上的例子还较多的采用第二种方法?莫非它有自己的优势??
Feedback
# re: C++完美实现Singleton模式 回复 更多评论
2009-01-06 20:15 by
第二种更像单件一点.
# re: C++完美实现Singleton模式 回复 更多评论
2009-01-07 01:18 by
其实你可以加锁的,如果你愿意的话。
Windows的Mutex是不跨进程的,你大可以用一个名字去建立一个mutex然后不释放,然后函数里面open之,阻塞之。
# re: C++完美实现Singleton模式 回复 更多评论
2009-11-10 16:05 by
如果不加保护,两种写法都有可能产生2个实例。
书上采用第2种形式居多的原因,可能是因为Gof的书……
第1种形式是Scott Meyers后来发明的。
# re: C++完美实现Singleton模式 回复 更多评论
2009-11-11 09:56 by
“线程安全”其实也没有那么必要处处提到的,有点过于炒作的感觉。真要计较起来,大部分代码都不是线程安全的。
# re: C++完美实现Singleton模式 回复 更多评论
2009-11-11 10:25 by
@溪流
嗯嗯,你说中了,炒作~_~
类似的还有很多……
# re: C++完美实现Singleton模式 回复 更多评论
2010-11-17 16:06 by
第一种方式在C++中不容易实现,因为成员变量的初始化顺序不能保证,可能会出现问题。第一种方式比较适合Java
# re: C++完美实现Singleton模式 回复 更多评论
2011-10-08 10:12 by
学习了