3 回答
TA贡献1831条经验 获得超10个赞
在C ++ 11中,它是线程安全的:
§6.7[stmt.dcl] p4如果在初始化变量的同时控件同时输入声明,则并发执行应等待初始化完成。
在C ++ 03中:
在g ++下,它是线程安全的。
但这是因为g ++显式添加了代码来保证它。
一个问题是,如果您有两个单例,并且它们在构造和销毁过程中相互尝试使用。
阅读本文: 查找C ++静态初始化顺序问题
此问题的一个变体是,是否从全局变量的析构函数访问单例。在这种情况下,单例无疑已被破坏,但是get方法仍将返回对被破坏对象的引用。
有很多解决方法,但是它们很杂乱,不值得做。只是不要从全局变量的析构函数访问单例。
一个更安全的定义但很丑陋:
我敢肯定您可以添加一些适当的宏来整理一下
SomeBaseClass &SomeClass::GetInstance()
{
#ifdef _WIN32
Start Critical Section Here
#elif defined(__GNUC__) && (__GNUC__ > 3)
// You are OK
#else
#error Add Critical Section for your platform
#endif
static SomeClass instance;
#ifdef _WIN32
END Critical Section Here
#endif
return instance;
}
TA贡献1111条经验 获得超0个赞
根据规范,这也应在VC ++中工作。有人知道吗?
只需添加关键字volatile。如果msdn上的文档正确,则可视c ++编译器应生成互斥体。
SomeBaseClass &SomeClass::GetInstance()
{
static volatile SomeClass instance;
return instance;
}
- 3 回答
- 0 关注
- 706 浏览
添加回答
举报