起動時にメインスレッドから2つのスレッドを起動するQtアプリケーションがあります。これらのスレッドは両方とも、QNetworkAccessManagerオブジェクトの個別のインスタンスを使用してネットワーク要求を行います。私のプログラムは約50%の確率でクラッシュし続けており、どのスレッドがクラッシュしているかわかりません。
2つのスレッド間で直接発生するデータ共有やシグナリングはありません。特定のイベントが発生すると、1つのスレッドがメインスレッドに信号を送り、メインスレッドが2番目のスレッドに信号を送ります。ただし、ログを印刷することで、シグナリング中にクラッシュが発生しないことを確信しています。
両方のスレッドの構造は次のとおりです。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);
}
奇妙なことに、スレッドの1つを開始しないと、プログラムは正常に実行されるか、少なくとも約20回の呼び出しでクラッシュしません。両方のスレッドが次々に実行される場合、プログラムはクラッシュしません。両方のスレッドを同時に起動して実行すると、プログラムは約半分の時間しかクラッシュしません。
ログから収集したもう1つの興味深い点は、プログラムがクラッシュするたびに、コメントでラベル付けされた行my log line
が両方のスレッドによって最後に実行されることです。そのため、どのスレッドがクラッシュを引き起こしているのかわかりません。しかし、QNetworkAccessManagerがどういうわけか責任があるのではないかと私は思います。
クラッシュの原因についてはかなり空白です。提案やアドバイスをいただければ幸いです。前もって感謝します。