繁体   English   中英

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

[英]How to safely delete a thread pointer in a destructor?

说,我有一个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?
}

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

这取决于你正在寻找什么样的行为。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM