28
|
okutane · 技术社区 · 16 年前 |
![]() |
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
|
![]() |
insipidintegrator · 通过迭代器/指针访问命名空间? 6 月前 |
|
Ben · 如何使用带有部分应用的过滤器功能的角度材质日期选择器? 1 年前 |
![]() |
larn · 这是工厂模式还是战略模式? 1 年前 |
![]() |
Community wiki · 您对存储库模式的理解是什么? 1 年前 |