2011-07-22 61 views
0

有一個叫做「pTrackerArray」的全局變量,它用在Loki的SetLongevity函數中。Loki的SetLongevity函數對我來說似乎不安全,是嗎?

pTrackerArray宣言:

typedef std::list<LifetimeTracker*> TrackerArray; 
extern LOKI_EXPORT TrackerArray* pTrackerArray; 

SetLongevity的定義:

template <typename T, typename Destroyer> 
void SetLongevity(T* pDynObject, unsigned int longevity, Destroyer d) 
{ 
    using namespace Private; 

    // manage lifetime of stack manually 
    if(pTrackerArray==0) 
     pTrackerArray = new TrackerArray; 

    // For simplicity, the rest of code is omitted 
    ... 
} 

是線程安全的SetLongevity使用pTrackerArray這樣?

回答

1

如圖所示,顯然不是。但是,如果我正確地閱讀了該文件的其餘部分,最終只能從一個函數中調用SetLongevity,該函數本身正確包裝在一個互斥體中[只要您明確指出該單例是線程安全的]。 因此,雖然該特定功能有問題,但其使用仍然非常安全。

但是,它們在該基本函數中創建的互斥量在您正在創建的單例類型上是參數化的,而該全局指針是在所有單例之間共享的。所以是的,它看起來好像兩個不同線程中的兩個不同的Singleton對象可以同時訪問該函數,導致havok。

+0

感謝您的回答。但我認爲它只適合你的描述,只要我們在多個線程中使用相同的Singleton :: Instance方法即可。當我們有幾個單例類並且每個類中的Instance()方法在不同的線程中運行時呢?當他們到達SetLongevity時,它在那裏還是安全的? – Rong

+0

嗯,你說得對,我沒有仔細看過最後一個功能。除非我錯過了某些東西,否則它確實看起來只能保護給定的單身人士。 –

相關問題