1

我听说在某些版本的 gcc 之后使用了类似的东西:

static A* a = new A();
return a;

对于单例来说是线程安全的,并且不再需要从http://locklessinc.com/articles/singleton_pattern/改编的东西......

有没有人有具体的参考或链接到我可以阅读的地方?

4

2 回答 2

3

标准草案(n3337.pdf)第 6.7 节,第 4 点:

具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的所有块范围变量的零初始化 (8.5) 在任何其他初始化发生之前执行。如果适用,具有静态存储持续时间的块范围实体的常量初始化(3.6.2)在其块首次进入之前执行。允许实现在与允许实现在命名空间范围(3.6.2)中静态初始化具有静态或线程存储持续时间的变量相同的条件下,对具有静态或线程存储持续时间的其他块范围变量执行早期初始化。否则,此类变量在控件第一次通过其声明时被初始化;这样的变量在其初始化完成时被认为已初始化。如果在初始化变量时控制同时进入声明,则并发执行应等待初始化完成。88 如果在初始化变量时控制以递归方式重新进入声明,则行为未定义。

于 2012-06-26T17:58:28.090 回答
1

GCC 遵循跨供应商Itanium C++ ABI。涉及函数局部静态的线程安全初始化的相关部分是2.8 Initialization guard variables3.3.2 One-time Construction API,其中说:

不期望支持多线程的实现可以简单地检查该保护变量的第一个字节(即具有最低地址的字节),当且仅当其值为零时才初始化,然后将其设置为非零值.

但是,旨在支持自动线程安全的一次性初始化(相对于要求显式用户控制线程安全)的实现可能会使用以下 API 函数: ...

该 API 的早期 GCC 实现中有一些错误,我认为它们都已修复,并且从 GCC 4.3 版开始可以正常工作(可能更早,我不记得,现在找不到参考。)

但是,Singleton 是一个糟糕的、糟糕的模式,不要使用它!

于 2012-06-26T19:08:59.483 回答