【发布时间】:2019-03-14 22:21:08
【问题描述】:
对于将被多个线程访问的对象,我是否需要为其构造函数和析构函数设置互斥锁?
我的猜测是我需要在析构函数中使用互斥锁,因为可能有一个线程访问该对象,而另一个线程删除该对象。
另一方面,我想不出为什么我们需要在构造函数中使用互斥锁,因为在对象完全构造之前不能有其他线程访问它。
【问题讨论】:
-
如果不了解您的实际用例,就无法回答这个问题。例如,如果您在析构函数中使用互斥锁,它不会阻止子析构函数运行(并且可能会在 vtable 上引入竞争)。
-
对象被构造或销毁时,必须只能由一个线程使用,否则逻辑上存在很大问题。因此,您不必同步 ctor 和 dtor。它没有意义。唯一有意义的同步是加入由该对象产生的线程。
-
如果有一个线程在等待访问一个正在反初始化的对象,我称之为bug。
-
如果你把互斥锁放在析构函数中为时已晚,你必须提前确保析构函数只被调用一次。构造函数也一样,它应该只运行一次,而不是一次只在一个线程中运行。请举个例子
-
如果您有一个线程访问该对象,而另一个线程正在删除该对象,则您有一个基本的设计问题。互斥锁不会拯救你。一种可能性是对象被销毁,然后另一个线程尝试访问它。
标签: c++ multithreading