我有一个多态对象 o
和两个线程 T1
和 T2
。
o
的最派生类的析构函数在返回之前等待 T2
的终止。
当 T2
正在调用 o
的一些虚函数时,让 T1
删除 o
是否安全? (我的意思是不使用互斥或任何其他类型的同步机制)
我相信它应该是安全的,除非允许 delete
甚至在第一个析构函数调用完成之前修改 o
(比如它指向 vtable 的指针)。是这样吗?
最佳答案
首先,如果你能避免这种情况,它是脆弱且容易出错的。您可以使其正常工作,但代码中的小改动可能会破坏它。
如果完整对象析构函数中的 block 所做的唯一事情是等待另一个线程的完成,并假设基对象具有虚拟析构函数或直接销毁完整对象,然后 这样做是安全的。在析构函数主体完成之前,对象的任何成员都不会被销毁,基类也不会。这意味着其他线程正在使用的子对象都不会在它完成之前被销毁(并让第一个线程完成析构函数的主体)。
话虽如此,再次尝试重新设计代码。
关于c++ - 多态对象销毁和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12452759/