回答
不以我的經驗。這是代碼構造函數隱式地或以其他方式調用,如果應用程序需要它,需要使其成爲線程安全的。
原理是一次只有一個線程應該初始化一個對象,因此不需要同步來保護在構造函數本身內被初始化的對象(如果對象沒有完成初始化,它不應該是無論如何,線程之間共享)。
另一種看待它的方法是:在構造函數返回之前,對象被視爲邏輯不存在。所以,一個正在創建一個對象的線程是唯一「知道」它的線程。
當然,適當的同步規則適用於任何共享資源的構造本身訪問,但適用於任何功能(我遇到未能認識到這一點的人,相信構造函數是特殊的,以某種方式提供獨家訪問所有資源)。
當然,您可以同時從多個線程調用相同的構造函數。它是有意義的,它們必須是線程安全的,就像任何其他函數一樣。如果構造函數要修改共享狀態(例如,容器),則必須使用同步來確保以確定的方式修改狀態。
不能一次在多個線程上構造同一個對象,因爲每個對象只構造一次,所以無法在同一個對象上多次調用構造函數,更不用說在兩個不同的線程上與此同時。
在C++中,對象的確在技術上存在,直到構造函數完成爲止,所以如果構造函數在對象外沒有副作用,其他線程是否可以訪問它? – ThomasMcLeod 2012-07-24 02:14:08
但是,有些方法可能最終會嘗試在同一個空間中同時構建兩個不同的對象......放置新的想法。雖然你自己可能不會這樣做。如果您將條目推回到矢量中,也會發生這種情況。如果您同步保護要創建的對象的內存位置,則不會發生這種情況 - 在此示例中,該向量會鎖定該向量。 – 2012-07-24 02:14:49
@MichaelAnderson,我沒有關注你的矢量例子。 – ThomasMcLeod 2012-07-24 02:21:19
一般來說,不能通過兩個線程同時調用構造函數的對象爲相同的對象。但是,同一構造函數肯定可以同時調用不同的對象。
單身模式不適用。 – PDuarte 2016-03-04 15:56:45
@PDuarte與單身人士,仍然只有一個構造函數調用一次。 – 2016-03-04 17:43:45
- 1. 構造函數和析構函數 - C++
- 2. malloc和C++構造函數
- 3. SWIG和C++構造函數
- 4. C++類,構造函數和函數
- 5. c#構造函數注入和構造函數重載
- 6. C++中的構造函數和析構函數與C#比較
- 7. C中的析構函數和構造函數C
- 8. C++:併發和析構函數
- 9. C#構造函數
- 10. C中的繼承和構造函數#
- 11. C#中的this()和base()構造函數
- 12. C++的構造函數和Qt
- 13. Cython和重載的C++構造函數
- 14. c#的構造函數和streamwriter
- 15. new []/delete []並在C++中拋出構造函數/析構函數
- 16. C++類構造函數/析構函數
- 17. 構造函數中的調用基構造函數和其他構造函數
- 18. C#的構造函數和構造對象的類型
- 19. C++中的構造函數
- 20. C++類的構造函數和析構函數
- 21. C++ 2構造函數和類中的析構函數
- 22. C++中構造函數和析構函數的內聯使用
- 23. 帶指針的C++ Struct:構造函數和析構函數
- 24. C++:構造器之間的差異()和構造函數(無效)
- 25. 默認構造函數與正常構造函數的類C++
- 26. 構造函數內的構造函數
- 27. 構造函數和析構函數
- 28. 析構函數和構造函數
- 29. C#構造函數和常量神祕
- 30. C++錯誤,類和構造函數
這不完全正確。在使用單例設計模式時,構造函數存在線程安全問題。現在我正在尋找解決這種情況的解決方法。 – PDuarte 2016-03-04 15:56:02