说,我有一个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?
}
答案 0 :(得分:1)
默认情况下,析构函数会调用terminate()
来杀死线程,如果它仍在运行,这是否安全取决于线程当时正在做什么。如果要等待线程完成,可以在删除它之前调用join()
,并使用某种同步系统(甚至只是一个全局标志)来告诉线程退出。
答案 1 :(得分:1)
这取决于您正在寻找的行为。
如果要删除该对象,并让它停止其拥有的线程然后删除其线程对象,那么您应该有一个停止标志,您的线程会不时检查。在析构函数中,您将设置停止标志,然后在您的线程上调用join()
。一旦它返回,你可以安全地删除指针。
另一方面,如果你想要删除对象并让线程自行完成直到完成,那么你需要一个更聪明的机制,比如在你的线程函数结束时,发布到主线程你的应用程序的一个回调,在你的线程上调用join()
,然后delete
它。当然,为此,您需要在线程函数中包含指向线程对象的指针。
修改强>
在boost::thread
的情况下,它只是在析构函数中分离,因此对于第二个选项,您可以在完成后安全地删除它。
但是,重要的是要注意,这不适用于std::thread
的析构函数,它将在这种情况下终止您的程序。但是,您也可以手动拨打detach()
然后delete
。所以你真的要看看你正在使用的API。
答案 2 :(得分:0)
不要删除它。完成后让线程自行删除。
答案 3 :(得分:0)
当没有更多代码可以运行时,您的程序就完成了。你的线程仍在运行代码吗?那为什么你认为你的程序已经完成了?
因此,假设你的线程是我完成的,这是合理的。这意味着您可以在线程上调用.join()
,之后可以调用delete
。