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

Div*_*oML 3 c++ multithreading

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

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

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

Mar*_*k R 5

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

现在,仅当所有强引用结束其生命周期时才会调用析构函数。这意味着当执行析构函数时,最后一个强引用只是被清理掉。同样,这意味着只有一个线程正在使用对象,因此没有同步的意义。

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

我能想象到的唯一同步在析构函数中有意义是加入线程 future(由该对象生成)或履行承诺。