析构函数与成员函数再次竞争

时间:2014-04-23 09:53:34

标签: c++ multithreading

我已经看过类似的问题:Destructor vs member function race ..但没有找到以下答案。假设我们有一个拥有一些工作线程的类。该类的析构函数可以如下所示:

~OurClass
{
    ask_the_thread_to_terminate;
    wait_for_the_thread_to_terminate;
    ....
    do_other_things;
}

问题是:我们可以在工作线程中调用OurClass的成员函数,因为我们确信所有这些调用都将在析构函数中的 do_other_things 之前完成?

3 个答案:

答案 0 :(得分:4)

是的,你可以。在do_other_things完成执行后,成员变量的破坏才会开始。在对象被破坏之前调用成员函数是安全的。

答案 1 :(得分:2)

嗯,你可以做到这一点,但这样很容易犯错误。例如,如果您执行以下操作:

~OurClass
{
    delete *memberPointer_; 
    ask_the_thread_to_terminate; // the thread calls OurClass::foo();
    wait_for_the_thread_to_terminate;
    ....
    do_other_things
}

void OurClass::foo()
{
    memberPointer->doSomething();
}
你会遇到麻烦。它还使得阅读代码变得更加困难。所以你必须小心操作的顺序和类似的东西。一般来说,如果可以改变架构以避免这种复杂的构造,我建议你这样做。

答案 2 :(得分:1)

任何数据成员的隐式销毁在执行析构函数的最后一个显式行之后发生,因此在等待线程时所有这些数据成员仍然完全正常运行。因此,您必须避免任何数据成员的过早显式破坏(如SingerOfTheFall的病理代码中所示)。