2013-01-10 65 views
1

我在多线程应用程序中使用OpenSSL库。
由于各种原因,我正在使用阻止SSL连接。并有客户挂起的情况QThread :: start:线程终止错误

SSL_connect 

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

QThread::terminate() 

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

QThread::start: Thread termination error: 

我查了“最大线程问题”,而不是在案件。
我正在使用QT 4.5,OpenSSL 1.0的CentOS 6.0
问题是如何完全终止一个线程。

+0

http://stackoverflow.com/questions/的可能重复之前14261067 /。 –

+0

@bn您可能想要链接其他东西 –

+0

您是否正在关注OpenSSL多线程要求??:http://stackoverflow.com/questions/3417706/openssl-and-multi-threads –

回答

2

Qt Documentation about terminate()告诉:

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

也:

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

假设您没有重新实现QThread::run()(这通常是没有必要的) - 或者,如果你真的重新实现运行,并呼吁exec()自己,通常的方式来停止一个线程是:

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

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

如果你确实想尽快摆脱线的,你也可以拨打wait()terminate()后,或者至少你再打电话start()

+0

我重新实现了QThread :: run ()实际上。不管怎样,谢谢。就我所见 - 解决我的问题的唯一方法是实现非阻塞openSSL函数的使用。 –