2014-03-05 44 views
1

在C++ 11中,如果我在一個線程中創建一個對象並將其設置爲std::atomic<T*>,是否可以保證構造函數在執行之前原子變量是否設置?在一個線程中創建一個對象並使用std :: atomic訪問另一個對象

具體而言,在下面的代碼中,如果「if」語句計算結果爲true,是否保證Widget()構造函數已完成?

std::atomic<Widget*> widget = NULL; 

在線程A:

widget = new Widget(); 

在線程B:

if(widget) { 
    // Do something with widget 
} 
+0

該作業是施工後。 – WhozCraig

+2

使用'nullptr' :) – melak47

+0

我想你會發現這個很有用:http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-1- 2 -12 –

回答

5

簡短的回答:是的。

龍答:構造函數的影響進行測序,之前分配給每widget 5.17 [expr.ass]/1「在所有情況下,分配的左右操作數的值 計算後測序,並且在賦值表達式的值計算之前。「。因此,構造函數的完成發生在任何與widget同步的任何讀取之前 - 寫入widget

+0

嗯......我可能是錯的,但我在考慮該部分正在討論指針值的排序,而不是指向的實際對象的內容。我看不出有什麼理由讓'atomic'默認爲普通的單值寫入操作提供完整的內存屏障。 –

+0

該賦值的右邊操作數的值計算將評估表達式new Widget()。該評估涉及爲Widget分配內存和進行值初始化。賦值運算符在賦值給左邊的操作數之前強制對該賦值的效果進行排序。這與左手操作數是否爲原子無關,並且爲單線程程序提供了必要的保證,我們可以立即開始使用「new」表達式的結果,而無需等待構建完成。 – Casey

+1

@JoachimIsaksson左手操作數是原子的事實強制對內存操作進行排序:在原子寫入之後,在寫入原子之前排序的任何寫入都不會被重新排序,而不會違反順序一致性。 (如果編譯器必須「拋出一個完整的內存障礙」來保證這種重新排序不會發生,那就這樣吧。) – Casey

相關問題