我有一个 Qt 应用程序,它在启动时从主线程启动两个线程。这两个线程都使用 QNetworkAccessManager 对象的不同实例发出网络请求。我的程序在大约 50% 的时间里不断崩溃,我不确定哪个线程正在崩溃。
两个线程之间没有直接发生数据共享或信令。当某个事件发生时,一个线程向主线程发出信号,而主线程又可以向第二个线程发出信号。但是,通过打印日志,我很确定在信令期间不会发生崩溃。
两个线程的结构如下。除了 URL 等之外,线程之间几乎没有任何区别。
MyThread() : QThread() {
moveToThread(this);
}
MyThread()::~MyThread() {
delete m_manager;
delete m_request;
}
MyThread::run() {
m_manager = new QNetworkAccessManager();
m_request = new QNetworkRequest(QUrl("..."));
makeRequest();
exec();
}
MyThread::makeRequest() {
m_reply = m_manager->get(*m_request);
connect(m_reply, SIGNAL(finished()), this, SLOT(processReply()));
// my log line
}
MyThread::processReply() {
if (!m_reply->error()) {
QString data = QString(m_reply->readAll());
emit signalToMainThread(data);
}
m_reply->deleteLater();
exit(0);
}
现在奇怪的是,如果我不启动其中一个线程,程序运行良好,或者至少在大约 20 次调用中不会崩溃。如果两个线程一个接一个地运行,程序就不会崩溃。如果我同时启动和运行两个线程,该程序只会崩溃大约一半的时间。
我从日志中收集到的另一件有趣的事情是,每当程序崩溃时,标有注释的行my log line
是两个线程最后执行的行。所以我不知道哪个线程导致崩溃。但这让我怀疑 QNetworkAccessManager 应该受到责备。
我对导致崩溃的原因一无所知。我将不胜感激任何建议或指示。提前致谢。