请帮助我解决以下问题:
我实现一个线程做一些工作。该线程隐式调用一些外部DLL。当然,我尽力处理这些DLL中的可能错误(使用try ... catch)但无法处理意外错误(例如内存异常)。
如果其中一个DLL遇到问题(某处出现bug或循环)并最终卡住,则该线程将永远不会完成(或关闭)。
在我的程序中,每个线程都与一个会话相关联(会话数量有限)。假设所有线程都被卡住,传入的会话将不得不永远等待。
有没有办法强制线程停止,即使它仍在工作或卡住?
请注意,我正在使用Boost库进行C ++编程。
欢迎任何建议!
提前致谢!
答案 0 :(得分:0)
您的操作系统库可能具有强制终止线程的功能,但这是一个坏主意,除非您完全确定这些DLL正在做什么。在Windows上,这将是TerminateThread
。对于POSIX,我相信它是pthread_cancel
。
从外部终止线程的问题是线程所持有的任何资源都将被泄露。例如,线程打开的任何打开文件都将保持打开状态,并且它所做的任何分配都将泄漏。
最好确保您的DLL永远不会卡住。我会记录一些东西并调试问题发生的地点和原因,而不是终止线程。
答案 1 :(得分:0)
你可以terminate a thread但听起来好像你需要在你的线程周围有某种框架。
执行此操作的一种方法是使用监视所有线程的监视程序线程。通过定期检查线程是否按预期运行,您可以确定是否需要终止一个(或多个)线程。
确定线程是否正常工作可以通过在每个线程中使用消息队列然后使用一些自定义消息来交换状态来完成。
答案 2 :(得分:0)
好吧,如果您无法访问库源并且无法控制其行为,那么最安全的解决方案可能是使用单独的进程而不是线程。当然,这需要一个更精细的解决方案,为工作人员提供数据并获取结果,但至少你可以安全地杀死挂着的工人并处理他们的任务(将他们发送到“未完成的邮箱”,重启等)。
也许,根据正在完成的工作的性质,你应该看看Boost.MPI。