如何安全地删除析构函数中的线程指针?

时间:2014-10-13 08:34:34

标签: c++ multithreading

说,我有一个C ++类,包括一个线程指针作为成员变量。线程一直运行,直到程序退出。 如果我删除了析构函数中的指针,那么该线程似乎还没有结束?管理这个或任何技巧的最佳做法是什么?

示例代码:

class Car {
public:
    Car();
    ~Car();
private:
    boost::thread *m_runningThreadPtr;
};


Car::Car() {
    m_runningThreadPtr = new boost::thread();
}

Car::~Car() {
    delete m_runningThreadPtr;    // The thread should be still running now. 
                                  // Problematic if it was deleted here?
}

4 个答案:

答案 0 :(得分:1)

默认情况下,析构函数会调用terminate()来杀死线程,如果它仍在运行,这是否安全取决于线程当时正在做什么。如果要等待线程完成,可以在删除它之前调用join(),并使用某种同步系统(甚至只是一个全局标志)来告诉线程退出。

答案 1 :(得分:1)

这取决于您正在寻找的行为。

如果要删除该对象,并让它停止其拥有的线程然后删除其线程对象,那么您应该有一个停止标志,您的线程会不时检查。在析构函数中,您将设置停止标志,然后在您的线程上调用join()。一旦它返回,你可以安全地删除指针。

另一方面,如果你想要删除对象并让线程自行完成直到完成,那么你需要一个更聪明的机制,比如在你的线程函数结束时,发布到主线程你的应用程序的一个回调,在你的线程上调用join(),然后delete它。当然,为此,您需要在线程函数中包含指向线程对象的指针。

修改boost::thread的情况下,它只是在析构函数中分离,因此对于第二个选项,您可以在完成后安全地删除它。 但是,重要的是要注意,这不适用于std::thread的析构函数,它将在这种情况下终止您的程序。但是,您也可以手动拨打detach()然后delete。所以你真的要看看你正在使用的API。

答案 2 :(得分:0)

不要删除它。完成后让线程自行删除。

答案 3 :(得分:0)

当没有更多代码可以运行时,您的程序就完成了。你的线程仍在运行代码吗?那为什么你认为你的程序已经完成了?

因此,假设你的线程是我完成的,这是合理的。这意味着您可以在线程上调用.join(),之后可以调用delete