对于将由多个线程访问的对象,我是否需要为其构造函数和析构函数使用互斥体?
我的猜测是我在析构函数中需要一个互斥锁,因为有可能一个线程访问该对象,而另一个线程删除该对象。
另一方面,我想不出为什么在构造函数中需要互斥锁的原因,因为在完全构造对象之前不可能有其他线程访问该对象。
答案 0 :(得分:4)
在构造对象之前,您无法共享对象。如果未共享,则只有一个线程使用它。结论不需要在构造函数中进行任何同步(除非您正在生成新线程)。
现在,仅当所有强引用都终止其生存期时才调用析构函数。这意味着在执行析构函数时,最后的强引用将被清除。同样,这意味着只有一个线程正在使用对象,因此没有同步点。
如果出于某种不可思议的原因,您将在构造函数或析构函数中出现竞争条件,则该错误必须在对象的所有者中。
在析构函数中,我能想象到的唯一同步是加入线程期货(由该对象产生)或履行诺言。