当我的应用程序被销毁时,我想终止(完成)QThread.因此,我调用terminate()和quit()内destructor从'我的QThread的派生类.安全吗?
class Session : public QThread
{
Q_OBJECT
private:
CheckerAdapter *inst;
public:
explicit Session(CheckerAdapter *inst, QObject *parent = 0);
void run();
~Session(){
terminate();
quit();
}
};
Run Code Online (Sandbox Code Playgroud)
使用QThread::terminate()可能会导致内存损坏,因为线程在它不知情的情况下被终止,它可以在终止时执行任何操作:
警告:此功能很危险,不鼓励使用.线程可以在其代码路径中的任何位置终止.修改数据时可以终止线程.线程无法自行清理,解锁任何保持的互斥锁等.简而言之,只有在绝对必要时才使用此功能.
为了安全地终止a QThread,你需要有一种方法来告诉线程它必须终止,并且当线程得到它时,它应该run()尽快从它的实现返回.Qt提供了两种方法:
run(),或者如果您调用exec()自定义run()实现),您可以从任何线程调用QThread::quit()/QThread::exit().这将导致线程事件的循环在完成处理当前事件后立即返回.没有数据损坏,因为当前处理不会终止.QThread::requestInterruption()任何其他线程告诉线程它应该停止.但是你必须在你的run()使用实现中处理它isInterruptionRequested()(否则,调用requestInterruption()将什么也不做).如果您使用上述任何方法来停止QThread其析构函数,则必须确保在QThread对象被破坏后该线程不再运行,您可以在使用/ 后调用QThread::wait().quit()requestInterruption()