28
|
okutane · 技术社区 · 15 年前 |
1
35
在C++ 11中,它是线程安全的:
在C++ 03中:
一个问题是,如果你有两个单件,他们试图在建设和破坏过程中互相使用。 阅读此: Finding C++ static initialization order problems 这个问题的一个变化是,如果从全局变量的析构函数访问单例。在这种情况下,singleton肯定已被销毁,但get方法仍将返回对已销毁对象的引用。 有很多方法可以解决这个问题,但它们很混乱,不值得做。不要从全局变量的析构函数访问单例。
一个更安全但丑陋的定义:
|
2
5
如图所示,它不是线程安全的。C++语言在线程上是无声的,所以语言没有内在的保证。您必须使用平台同步原语(例如win32::enterCriticalSection())来保护访问。
您的特定方法是有问题的b/c编译器将插入一些(非线程安全的)代码来初始化静态的
使用全局/静态成员指针指向
我还没有编译这个,所以它只是为了说明目的。它还依赖于Boost库来获得与原始示例相同的生存期(或大致相同的生存期)。您还可以使用STD::Tr1(C++0x)。 |
3
1
根据规范,这也适用于VC++。有人知道是不是? 只需添加关键字volatile。 如果MSDN上的DOC是正确的,VisualC++编译器就应该生成互斥体。
|
4
-7
|
S qasem · Android内存性能 6 年前 |
R83nLK82 · 在单例设计模式上引发IOException 6 年前 |
hal · 两个课程有什么区别?他们的工作方式不同吗? 6 年前 |
Jaquarh · 如何在不使用DI的情况下实例化父类 6 年前 |
Deepanshu · 基于PHP的Web应用程序中的单例对象状态 6 年前 |
dicle · 视图控制器中的依赖项注入 6 年前 |
Kozuki · 如何在生产代码中考虑单例? 6 年前 |