1

マルチスレッド アプリケーションで OpenSSL ライブラリを使用しています。
さまざまな理由から、SSL 接続のブロックを使用しています。そして、クライアントがハングアップする状況があります

SSL_connect

関数。
接続手順を別のスレッドに移動し、タイマーを作成しました。タイムアウト時、接続スレッドは次を使用して終了します。

QThread::terminate()

スレッドは終了可能ですが、次にスレッドを開始しようとすると、次のようになります。

QThread::start: Thread termination error: 

「最大スレッドの問題」を確認しましたが、そうではありません。
QT 4.5、OpenSSL 1.0 で CentOS 6.0 に取り組んでい
ます。問題は、スレッドを完全に終了する方法です。

4

1 に答える 1

2

terminal()に関するQtドキュメントには、次のように書かれています。

オペレーティングシステムのスケジューリングポリシーに応じて、スレッドはすぐに終了する場合と終了しない場合があります。同期終了には、terminate()の後にQThread :: wait()を使用します。

だけでなく:

警告:この機能は危険であり、使用しないでください。スレッドは、コードパスの任意の時点で終了できます。データの変更中にスレッドを終了できます。スレッドがそれ自体の後でクリーンアップしたり、保持されているミューテックスのロックを解除したりする可能性はありません。要するに、この関数はどうしても必要な場合にのみ使用してください。

再実装しなかったと仮定するとQThread::run()(通常は必要ありません)、または実際にrunを再実装してexec()自分自身を呼び出した場合、スレッドを停止する通常の方法は次のようになります。

_thread->quit();
_thread->wait();

最初の行は、スレッドに非同期で実行を停止するように指示します。これは通常、スレッドが現在実行していることをすべて終了し、イベントループから戻ることを意味します。ただし、常に即座に戻るため、実際に終了するまでメインスレッドがブロックされるようquit()に呼び出す必要があります。その後、再び安全にスレッドを作成できます。wait()_threadstart()

本当にできるだけ早くスレッドを削除したい場合は、wait()後で、terminate()または少なくともstart()再度呼び出す前に呼び出すこともできます

于 2013-01-10T15:43:49.537 に答える