C ++多线程:构造函数和析构函数是否需要互斥体?

时间:2019-03-14 14:05:29

标签: c++ multithreading

对于将由多个线程访问的对象,我是否需要为其构造函数和析构函数使用互斥体?

我的猜测是我在析构函数中需要一个互斥锁,因为有可能一个线程访问该对象,而另一个线程删除该对象。

另一方面,我想不出为什么在构造函数中需要互斥锁的原因,因为在完全构造对象之前不可能有其他线程访问该对象。

1 个答案:

答案 0 :(得分:4)

在构造对象之前,您无法共享对象。如果未共享,则只有一个线程使用它。结论不需要在构造函数中进行任何同步(除非您正在生成新线程)。

现在,仅当所有强引用都终止其生存期时才调用析构函数。这意味着在执行析构函数时,最后的强引用将被清除。同样,这意味着只有一个线程正在使用对象,因此没有同步点。

如果出于某种不可思议的原因,您将在构造函数或析构函数中出现竞争条件,则该错误必须在对象的所有者中。

在析构函数中,我能想象到的唯一同步是加入线程期货(由该对象产生)或履行诺言。