2012-07-24 88 views
5

我一直在考慮編寫一個容器類來控制對多線程環境中使用的複雜數據結構的訪問。C++的構造函數和併發

再發生,我的問題是:

是否有過的情況下C++的構造函數必須是線程安全的嗎?

回答

2

不以我的經驗。這是代碼構造函數隱式地或以其他方式調用,如果應用程序需要它,需要使其成爲線程安全的。

原理是一次只有一個線程應該初始化一個對象,因此不需要同步來保護在構造函數本身內被初始化的對象(如果對象沒有完成初始化,它不應該是無論如何,線程之間共享)。

另一種看待它的方法是:在構造函數返回之前,對象被視爲邏輯不存在。所以,一個正在創建一個對象的線程是唯一「知道」它的線程。

當然,適當的同步規則適用於任何共享資源的構造本身訪問,但適用於任何功能(我遇到未能認識到這一點的人,相信構造函數是特殊的,以某種方式提供獨家訪問所有資源)。

+0

這不完全正確。在使用單例設計模式時,構造函數存在線程安全問題。現在我正在尋找解決這種情況的解決方法。 – PDuarte 2016-03-04 15:56:02

3

當然,您可以同時從多個線程調用相同的構造函數。它是有意義的,它們必須是線程安全的,就像任何其他函數一樣。如果構造函數要修改共享狀態(例如,容器),則必須使用同步來確保以確定的方式修改狀態。

不能一次在多個線程上構造同一個對象,因爲每個對象只構造一次,所以無法在同一個對象上多次調用構造函數,更不用說在兩個不同的線程上與此同時。

+0

在C++中,對象的確在技術上存在,直到構造函數完成爲止,所以如果構造函數在對象外沒有副作用,其他線程是否可以訪問它? – ThomasMcLeod 2012-07-24 02:14:08

+1

但是,有些方法可能最終會嘗試在同一個空間中同時構建兩個不同的對象......放置新的想法。雖然你自己可能不會這樣做。如果您將條目推回到矢量中,也會發生這種情況。如果您同步保護要創建的對象的內存位置,則不會發生這種情況 - 在此示例中,該向量會鎖定該向量。 – 2012-07-24 02:14:49

+0

@MichaelAnderson,我沒有關注你的矢量例子。 – ThomasMcLeod 2012-07-24 02:21:19

4

一般來說,不能通過兩個線程同時調用構造函數的對象爲相同的對象。但是,同一構造函數肯定可以同時調用不同的對象。

+0

單身模式不適用。 – PDuarte 2016-03-04 15:56:45

+0

@PDuarte與單身人士,仍然只有一個構造函數調用一次。 – 2016-03-04 17:43:45