【发布时间】:2010-09-05 15:14:34
【问题描述】:
有没有办法在 C++ 中实现单例对象,即:
- 以线程安全的方式延迟构造(两个线程可能同时是单例的第一个用户 - 它仍然应该只构造一次)。
- 不依赖于预先构造的静态变量(因此在构造静态变量期间使用单例对象本身是安全的)。
(我不太了解我的 C++,但是在执行任何代码之前初始化整数和常量静态变量是否是这种情况(即,甚至在执行静态构造函数之前 - 它们的值可能已经“初始化”在程序图像中)?如果是这样 - 也许可以利用它来实现单例互斥锁 - 这又可以用来保护真正单例的创建..)
太好了,我现在似乎有几个很好的答案(遗憾的是我不能将 2 或 3 标记为 答案)。似乎有两种广泛的解决方案:
- 使用 POD 静态变量的静态初始化(与动态初始化相反),并使用内置原子指令实现我自己的互斥锁。这是我在问题中暗示的解决方案类型,我相信我已经知道了。
- 使用其他一些库函数,如pthread_once 或boost::call_once。这些我当然不知道 - 非常感谢发布的答案。
【问题讨论】:
标签: c++ multithreading singleton construction lazy-initialization