QThread :: start:线程终止错误

时间:2013-01-10 15:13:48

标签: qt openssl qthread

我在多线程应用程序中使用OpenSSL库 由于各种原因,我正在使用阻止SSL连接。当客户端挂起时有一种情况

SSL_connect

功能。
我将连接过程移动到另一个线程并创建了计时器。在超时连接时,使用以下命令终止线程:

QThread::terminate()

该线程是可终止的,但在下次尝试启动线程时我得到:

QThread::start: Thread termination error: 

我检查了“最大线程问题”,但事实并非如此 我正在使用QT 4.5,OpenSSL 1.0的CentOS 6.0 问题是如何完全终止线程。

1 个答案:

答案 0 :(得分:2)

Qt Documentation about terminate()告诉:

  

根据操作系统调度策略,线程可能会立即终止,也可能不会立即终止。在terminate()之后使用QThread :: wait()进行同步终止。

但也是:

  

警告:此功能很危险,不建议使用它。线程可以在其代码路径中的任何位置终止。修改数据时可以终止线程。线程无法自行清理,解锁任何保持的互斥锁等。简而言之,只有在绝对必要时才使用此功能。

假设您没有重新实现QThread::run()(通常不需要) - 或者如果您实际重新实现了run并且自己调用了exec(),那么停止线程的常用方法是:

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

第一行以异步方式告诉线程停止执行,这通常意味着线程将完成当前正在执行的任何操作,然后从它的事件循环返回。但是,quit()总是立即返回,这就是为什么你需要调用wait()所以主线程被阻塞,直到_thread实际结束。之后,您可以再次安全地start()线程。

如果你真的想尽快摆脱线索,你也可以在wait()之后或至少在再次致电terminate()之前致电start()