c++ - 多态对象销毁和并发

标签 c++ multithreading c++11 parallel-processing delete-operator

我有一个多态对象 o 和两个线程 T1T2

o 的最派生类的析构函数在返回之前等待 T2 的终止。

T2 正在调用 o 的一些虚函数时,让 T1 删除 o 是否安全? (我的意思是不使用互斥或​​任何其他类型的同步机制)


我相信它应该是安全的,除非允许 delete 甚至在第一个析构函数调用完成之前修改 o(比如它指向 vtable 的指针)。是这样吗?

最佳答案

首先,如果你能避免这种情况,它是脆弱且容易出错的。您可以使其正常工作,但代码中的小改动可能会破坏它。

如果完整对象析构函数中的 block 所做的唯一事情是等待另一个线程的完成,并假设基对象具有虚拟析构函数或直接销毁完整对象,然后 这样做是安全的。在析构函数主体完成之前,对象的任何成员都不会被销毁,基类也不会。这意味着其他线程正在使用的子对象都不会在它完成之前被销毁(并让第一个线程完成析构函数的主体)。

话虽如此,再次尝试重新设计代码。

关于c++ - 多态对象销毁和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12452759/

相关文章:

c++ - 成员与全局阵列访问性能

C++ 继承 : Templates Vs Pointers

c++ - 如何实时监控不同的 OpenMP 线程?

c++ - 子类模板错误(C++): "error: ' root' was not declared in this scope"

java - 在应用程序关闭时刷新打印机

multithreading - 在连接开始时将 SSL 与 Netty 结合使用,然后将其禁用

multithreading - Rust mpsc::Sender 不能在线程间共享?

c++ - 如何计算调用递归的次数? (计算 x^n 的乘法次数)

c++ - Qt转发信号/槽连接

c++ - C++0x lambda 和 operator()、闭包和仿函数之间的区别