2012-07-24 84 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