2013-07-29 42 views
0

目前我有這個實施邁耶單例:邁爾斯辛格爾頓線程使用C安全++ - 98

class ClassA 
{ 
public: 
    static ClassA& GetInstance() 
    {     
     static ClassA instance;  
     return instance; 
    } 

private: 
    ClassA::ClassA() {}; 

    // avoid copying singleton 
    ClassA(ClassA const&); 
    void operator = (ClassA const&); 
}; 

現在我需要在C++得到這個代碼線程安全的一些改進 - 98和VS-2008?

謝謝!

PS:什麼不清楚?你會看到標籤visual-studio-2008和C++ - 98 - >所以目標操作系統是Windows!我也不明白爲什麼我拒絕投票,有些人根本不喜歡辛格爾頓!

+1

最簡單的改進就是不要使用單例。 –

+2

你的問題到底是什麼?你想知道使用什麼同步機制?由於標準C++ 98中沒有線程,這取決於您正在使用的操作系統和線程庫。 – Hulk

+2

-1,因爲你1)沒有問過實際的* questions *,2)似乎認爲堆棧溢出是一個神奇的代碼生成機器。 –

回答

4

邁耶單身人士不是一般的最佳解決方案,並且 尤其不在多線程環境中。實現單的更一般的 的辦法是:

class ClassA 
{ 
    static ClassA* ourInstance; 
    // ctor's, etc. 
public: 
    static ClassA& instance(); 
}; 

,並在源文件中:

ClassA* ClassA::ourInstance = &instance(); 

// This can be in any source file. 
ClassA& 
ClassA::instance() 
{ 
    if (ourInstance == NULL) { 
     ourInstance = new ClassA; 
    } 
    return *ourInstance; 
} 

這是線程安全的如果沒有線程進入 main之前創建的(應是這種情況),並且它不是動態加載的 (如果對象是 是唯一的,也應該是這種情況—,並且可以從靜態 對象,那麼它必須是它們的靜態構造函數 運行時)。它還具有避免任何銷燬訂單的優勢。

+0

不是你的推理,這是線程安全的原始代碼工作? – GManNickG

+0

靜態成員是否保證在輸入'main'之前被初始化,即使它在不同的翻譯單元中?在C++ 11中沒有保證,但C++ 98/03在我看來更加模糊。 –

+0

@MikeSeymour官方,我認爲即使在C++ 11中也不能保證。實際上,有太多的代碼依賴於它,我認爲你不必擔心。 –