2014-01-15 61 views
0

请帮我以下的问题:问题与DLL和线程

  • 我执行一个线程做一些工作。这个线程隐含地调用一些外部DLL。当然,我尽我所能处理这些DLL中的可能错误(使用try ... catch),但无法处理意外错误(例如内存异常)。

  • 如果其中一个DLL遇到问题(错误或循环某处)并最终卡住,则此线程将永远不会完成(或关闭)。

在我的程序,每个线程与会话关联(会话的数量是有限的)。假设所有线程都卡住了,传入的会话将不得不永久等待。

有什么办法强制线程停止,即使它仍在工作或卡住?

请注意,我正在使用C++编程和Boost库。

任何建议,欢迎!

在此先感谢!

回答

0

你的操作系统的库可能有一个强制终止线程的函数,但这是一个坏主意,除非你完全确定这些DLL正在做什么。在Windows上,这将是TerminateThread。对于POSIX,我相信它是pthread_cancel

从外部终止线程的问题是线程所持有的任何资源都将被泄漏。例如,线程打开的任何打开的文件都将保持打开状态,并且所做的任何分配都会泄漏。

最好确保你的DLL永远不会卡住。我不会终止线程,而是记录一些内容并调试发生问题的位置和原因。

+0

感谢您的解释。问题是有些DLL是由其他人实现的,并且源代码不可用。我无法确切知道他们在这些DLL中做了什么。 – user746317

0

你可以terminate a thread但它听起来好像你需要围绕你的线程有某种框架。

做到这一点的一种方法是有一个监视线程监视所有线程。通过定期检查线程是否按预期运行,您可以确定是否需要终止一个(或多个)线程。

确定一个线程是否工作可以通过例如在每个线程中有一个消息队列然后使用一些自定义消息来交换状态来完成。

0

那么,如果您无法访问库源,并且绝对没有办法控制其行为,那么最安全的解决方案可能是使用单独的进程而不是线程。当然,这需要一个更详细的解决方案,为工作人员提供数据并获取结果,但至少可以安全地杀死工人并处理他们的任务(将他们发送到“未完成的邮箱”,重新启动等)。

也许,根据所做工作的性质,您应该看看Boost.MPI。