2013-10-29 87 views
0

在POCO框架中,SingletonHodler是用於管理sigleton對象的模板類。其獲得的單獨的對象的方法是:線程安全SingletonHolder性能?

S* get() 
    /// Returns a pointer to the singleton object 
    /// hold by the SingletonHolder. The first call 
    /// to get will create the singleton. 
{ 
    FastMutex::ScopedLock lock(_m); 
    if (!_pS) _pS = new S; 
    return _pS; 
} 

的問題是此方法始終使用互斥,以確保不存在在多線程環境中創建多於一個單獨的對象。我認爲第一次同步所調用的方法是合適的。如果我們之後進行同步,它會浪費資源。我知道Double check locking可以解決這個問題,但它可能是broken

我的問題是POCO寧願確保多線程環境中的安全性而不是節省資源?

+0

不要使用單身人士,你永遠不會有任何單身人士相關的問題。 – rightfold

+2

有關某個構造的性能的任何問題都應該回答「您是否測量過您的用例?」。你有嗎? – EricSchaefer

回答

0

按照你的想法沒有什麼阻止你使用它喜歡:

MySingleton* s = mySingletonHolder.get(); 
    s->doSomething(); //no locking 
    ... 
    s->doSomething(); //no locking 

很顯然,如果你用它總是喜歡:

mySingletonHolder.get()->doSomthing(); 
    ... 
    mySingletonHolder.get()->doSomthing(); 

你將永遠有鎖的開銷。

順便說一句,如果你在多線程場景中使用你的單例實例,你應該保證調用doSomething()是線程安全的。只做mySingletonHolder.get() - > doSomthing();不保證你。