析构函数与成员函数竞争

时间:2009-01-20 16:15:07

标签: c++ multithreading destructor

当我在析构函数中时,是否有其他线程可能会开始执行对象的成员函数?如何应对这种情况?

3 个答案:

答案 0 :(得分:17)

C ++在删除对象后没有使用对象的内在保护 - 忘记竞争条件 - 另一个线程可以在完全删除后使用你的对象。

或者:

  1. 确保只有一个地方 代码拥有对象,而且它是 负责在没人时删除 正在使用该对象。
  2. 制作 对象引用计数 - 添加 显式引用计数代码,或 找到合适的基类 实现引用计数

答案 1 :(得分:15)

你不应该破坏一个对象,除非你确定没有别的东西会试图使用它 - 理想情况下没有别的东西可以引用它。当你打电话给删除时,你需要仔细查看。

答案 2 :(得分:2)

如果因异常处理程序中的堆栈展开而在析构函数中,我建议重新排列代码,以便在序列化块中捕获异常。

在阻止之后,检查对象是否仍然有效并调用您的方法。这样,一个线程中的异常将允许其他线程正常处理对析构函数的调用。