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

关于 terminate()的Qt 文档告诉:

线程可能会或可能不会立即终止,具体取决于操作系统的调度策略。在 terminate() 之后使用 QThread::wait() 进行同步终止。

但是也:

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

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

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

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

如果您真的想尽快摆脱线程,您也可以在再次调用wait()之后terminate()或至少在start()再次调用之前调用

于 2013-01-10T15:43:49.537 回答