前几天 friend 跟我说了他们项目中的情况。
有人决定,最好在并行线程(如异步)中销毁 NotVerySafeClass
的对象。它是前一段时间实现的。
现在他们崩溃了,因为在主线程中调用了一些方法,而对象被销毁了。
已创建一些解决方法来处理这种情况。
当然,这只是一个不太好的解决方案的例子,但问题仍然存在:
有没有办法在 NotVerySafeClass
内部防止这种情况(拒绝运行 methods
,如果 destructor
已经被调用,并强制destructor
等待,直到任何正在运行的 method
结束(假设只有一个 method
))?
最佳答案
不,不,不。这是一个基本的设计问题,它显示了在考虑多线程情况和一般竞争条件时的常见误解。
有一件事发生的可能性相同,这确实表明您需要一个所有权概念:函数调用线程可以在对象被销毁后立即调用该函数,因此不再有对象并尝试在其上调用函数是 UB,并且由于该对象不再存在,它也没有机会阻止 dtor 和成员函数之间的任何交互。
关于c++ - 销毁对象时运行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7399316/