我在多线程应用程序中使用OpenSSL库 由于各种原因,我正在使用阻止SSL连接。当客户端挂起时有一种情况
SSL_connect
功能。
我将连接过程移动到另一个线程并创建了计时器。在超时连接时,使用以下命令终止线程:
QThread::terminate()
该线程是可终止的,但在下次尝试启动线程时我得到:
QThread::start: Thread termination error:
我检查了“最大线程问题”,但事实并非如此 我正在使用QT 4.5,OpenSSL 1.0的CentOS 6.0 问题是如何完全终止线程。
答案 0 :(得分:2)
Qt Documentation about terminate()告诉:
根据操作系统调度策略,线程可能会立即终止,也可能不会立即终止。在terminate()之后使用QThread :: wait()进行同步终止。
但也是:
警告:此功能很危险,不建议使用它。线程可以在其代码路径中的任何位置终止。修改数据时可以终止线程。线程无法自行清理,解锁任何保持的互斥锁等。简而言之,只有在绝对必要时才使用此功能。
假设您没有重新实现QThread::run()
(通常不需要) - 或者如果您实际重新实现了run并且自己调用了exec()
,那么停止线程的常用方法是:
_thread->quit();
_thread->wait();
第一行以异步方式告诉线程停止执行,这通常意味着线程将完成当前正在执行的任何操作,然后从它的事件循环返回。但是,quit()
总是立即返回,这就是为什么你需要调用wait()
所以主线程被阻塞,直到_thread
实际结束。之后,您可以再次安全地start()
线程。
如果你真的想尽快摆脱线索,你也可以在wait()
之后或至少在再次致电terminate()
之前致电start()