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 關注
- 756 瀏覽
添加回答
舉報