回答
不以我的经验。这是代码构造函数隐式地或以其他方式调用,如果应用程序需要它,需要使其成为线程安全的。
原理是一次只有一个线程应该初始化一个对象,因此不需要同步来保护在构造函数本身内被初始化的对象(如果对象没有完成初始化,它不应该是无论如何,线程之间共享)。
另一种看待它的方法是:在构造函数返回之前,对象被视为逻辑不存在。所以,一个正在创建一个对象的线程是唯一“知道”它的线程。
当然,适当的同步规则适用于任何共享资源的构造本身访问,但适用于任何功能(我遇到未能认识到这一点的人,相信构造函数是特殊的,以某种方式提供独家访问所有资源)。
当然,您可以同时从多个线程调用相同的构造函数。它是有意义的,它们必须是线程安全的,就像任何其他函数一样。如果构造函数要修改共享状态(例如,容器),则必须使用同步来确保以确定的方式修改状态。
不能一次在多个线程上构造同一个对象,因为每个对象只构造一次,所以无法在同一个对象上多次调用构造函数,更不用说在两个不同的线程上与此同时。
在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. c#构造函数注入和构造函数重载
- 3. C中的析构函数和构造函数C
- 4. C++中的构造函数和析构函数与C#比较
- 5. C#构造函数
- 6. new []/delete []并在C++中抛出构造函数/析构函数
- 7. C++的构造函数和Qt
- 8. C#中的this()和base()构造函数
- 9. 构造函数中的调用基构造函数和其他构造函数
- 10. C++:构造器之间的差异()和构造函数(无效)
- 11. C++复制构造函数和赋值
- 12. C++和STL:构造函数工厂
- 13. C++:使用类和构造函数
- 14. 默认构造函数C++头和cpp
- 15. C++ 11委托构造函数和typedef
- 16. C#构造函数和常量神秘
- 17. C++继承和构造函数
- 18. C++对象创建和构造函数
- 19. C++ OOP类和构造函数
- 20. 指针和拷贝构造函数C++
- 21. 拷贝构造函数和operator =在C++
- 22. 复制构造函数和析构函数八叉树C++
- 23. C++ - 构造函数,复制构造函数,移动构造函数,析构函数
- 24. 字符串类的构造函数和复制构造函数
- 25. C#构造函数重载
- 26. C#构造函数问题
- 27. C + +构造函数错误
- 28. C#构造函数帮助
- 29. C#构造函数重载
- 30. C++构造函数错误
这不完全正确。在使用单例设计模式时,构造函数存在线程安全问题。现在我正在寻找解决这种情况的解决方法。 – PDuarte 2016-03-04 15:56:02