Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DLL&;线程_C++_Multithreading_Dll - Fatal编程技术网

C++ DLL&;线程

C++ DLL&;线程,c++,multithreading,dll,C++,Multithreading,Dll,请帮我解决以下问题: 我实现了一个线程来做一些工作。此线程隐式调用一些外部DLL。当然,我尽力处理那些DLL中可能出现的错误(使用try…catch),但无法处理意外错误(例如内存异常) 如果其中一个DLL遇到问题(某个地方的bug或循环)并最终被卡住,该线程将永远无法完成(或关闭) 在我的程序中,每个线程都与一个会话相关联(会话的数量是有限的)。假设所有线程都被卡住,传入会话将不得不永远等待 有没有办法强迫线程停止,即使它仍然在工作或卡住 注意,我使用的是用Boost库编程的C++程序。

请帮我解决以下问题:

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

  • 如果其中一个DLL遇到问题(某个地方的bug或循环)并最终被卡住,该线程将永远无法完成(或关闭)

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

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

注意,我使用的是用Boost库编程的C++程序。 欢迎任何建议


提前谢谢

您的操作系统库可能具有强制终止线程的功能,但这不是一个好主意,除非您完全确定这些DLL在做什么。在Windows上,这将是
TerminateThread
。对于POSIX,我认为它是
pthread\u cancel

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

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

您可以,但听起来好像您需要在线程周围建立某种框架

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


要确定某个线程是否正在工作,可以通过在每个线程中设置消息队列,然后使用一些自定义消息来交换状态来完成,如果您无法访问库源代码,并且完全无法控制其行为,那么最安全的解决方案可能是使用单独的进程而不是线程。当然,这需要一个更详细的解决方案来为工作人员提供数据并获取其结果,但至少您可以安全地杀死挂起的工作人员并处理他们的任务(将他们发送到“未完成的邮箱”,重新启动等)


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

谢谢您的解释。问题是有些DLL是由其他DLL实现的,并且源代码不可用。我不能确切地知道他们在那些DLL中做什么。