c ++构造函数和并发

Tho*_*eod 5 c++ concurrency constructor

我一直在考虑编写一个容器类来控制对将在多线程环境中使用的复杂数据结构的访问.

然后问题发生在我身上:

是否存在c ++构造函数必须是线程安全的情况?

Gre*_*ill 5

通常,两个线程不能同时为同一个对象调用构造函数。但是,当然可以同时为不同的对象调用相同的构造函数。


def*_*ube 3

以我的经验来看并非如此。它是隐式或以其他方式调用构造函数的代码,如果应用程序需要它,则需要使其成为线程安全的。

基本原理是一次只能有一个线程初始化一个对象,因此不需要同步来保护在构造函数本身内初始化的对象(如果该对象尚未完成初始化,则无论如何都不应该在线程之间共享它) )。

另一种看待它的方式是:对象在其构造函数返回之前被视为逻辑上不存在。因此,正在创建对象的线程是唯一“知道”该对象的线程。

当然,正确的同步规则适用于构造函数本身访问的任何共享资源,但这适用于任何函数(我遇到过没有意识到这一点的人,认为构造函数是特殊的并且以某种方式提供对所有资源的独占访问)。