【发布时间】:2010-09-14 22:28:57
【问题描述】:
我一直在这里阅读有关线程安全的单例模式:
http://en.wikipedia.org/wiki/Singleton_pattern#C.2B.2B_.28using_pthreads.29
它在底部说唯一安全的方法是使用 pthread_once - 这在 Windows 上不可用。
这是保证线程安全初始化的唯一方式吗?
我在 SO 上读过这个帖子:
Thread safe lazy construction of a singleton in C++
并且似乎暗示了原子操作系统级别的交换和比较功能,我假设在 Windows 上是:
http://msdn.microsoft.com/en-us/library/ms683568.aspx
这可以做我想做的事吗?
编辑:我想要延迟初始化并且永远只有一个类的实例。
另一个站点上的某个人提到在命名空间内使用全局变量(他将单例描述为反模式) - 它怎么可能是“反模式”?
接受的答案:
我已接受 Josh's answer,因为我正在使用 Visual Studio 2008 - 注意:对于未来的读者,如果您不使用此编译器(或 2005) - 不要使用已接受的答案!!
编辑: 代码工作正常,除了 return 语句 - 我得到一个错误: 错误 C2440:“return”:无法从“volatile Singleton *”转换为“Singleton *”。 我应该将返回值修改为 volatile Singleton *?
编辑:显然 const_cast 将删除 volatile 限定符。再次感谢乔希。
【问题讨论】:
-
在创建任何线程之前初始化 singelton。
-
Singelton 是一种反模式,因为它大多使用不正确。即作为全局变量的替代品。
-
全局变量不只是 C 语言的一个令人讨厌的回归吗?
-
如何在 Josh 的回答中初始化 CRITICAL_SECTION 'cs'?
-
关于如何在 C++ 中实现单例以及线程安全的精彩讨论可以在这篇论文中找到:aristeia.com/Papers/DDJ%5FJul%5FAug%5F2004%5Frevised.pdf