DLL 和线程的问题

Problems with DLL & threads

本文关键字:问题 线程 DLL      更新时间:2023-10-16

请帮我解决以下问题:

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

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

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

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

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

欢迎任何建议!

提前感谢!

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

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

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

你可以终止一个线程,但听起来好像你需要在你的线程周围有某种框架。

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

要确定线程是否正常工作,例如,可以在每个线程中都有一个消息队列,然后使用一些自定义消息来交换状态。

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

也许,根据正在完成的工作的性质,你应该看看Boost.MPI。