2016-05-03 37 views
1

對類的成員調用有兩種類型,一種是直接使用點(.)引用特定對象的成員函數,另一種方法是使用雙冒號,例如Obj::function()雙冒號訪問(::)到類成員線程安全嗎?

我的問題是,雙冒號呼叫成員是一個線程安全的操作?

+4

我不認爲'::'說一般關於線程安全的_anything_。可能你必須問你打算使用的圖書館的作者和/或閱讀該圖書館的文檔。 –

+10

雙冒號'::'是* scope *操作符。它只是一個表示範圍的運算符,沒有別的。 –

+0

雙冒號在運行時不存在......它只被編譯器用來選擇在編譯時調用*的正確方法*。 – Bakuriu

回答

2

對成員的雙冒號調用是線程安全的操作嗎?

如果調用的函數是線程安全的,則它是線程安全的。例如:

class C 
{ 
    static std::string mx; 

public: 
    static std::string fx(const char* x) { mx = x; return mx; } // NOT THREAD SAFE 
    static std::string fy(const char* y) { return y; } // THREAD SAFE 
}; 

你可以調用函數:

cout << C::fx("hello") << endl; // NOT THREAD SAFE 
cout << C::fy("world") << endl; // THREAD SAFE 

因此,無關與兩個冒號,什麼都做的方法實現。

0

::是什麼你甚至不得不在運行時打擾。所以是的,它是線程安全的,因爲當線程開始行動時它已經被解決了。

::僅用於明確在可能存在不明確名稱的情況下引用哪個名稱空間或類作用域。