我有第三方库(dll),我没有源代码。我想限制这个dll完成任务所用的时间。如果它超时,我很高兴它继续下一个任务。
我尝试过使用std :: threads,但没有终止线程功能。我想尝试从我的应用程序中保持提升,但我知道它支持终止。
我可以将dll包装在自己的exe中并进行系统调用,我可以在指定的时间后杀死它。但这似乎不够优雅。
调用此dll的api的最佳方法是什么,但如果在指定的时间段后没有完成,请将其删除?
答案 0 :(得分:1)
我可以将dll包装在自己的exe中并进行系统调用,我可以在指定的时间后杀死它。但这似乎不够优雅。
尽管它看起来很古老,但这几乎肯定是最好的方法。您没有源代码,并且您正在调用的库例程的文档不太可能说明它们是获取还是锁定任何资源(例如堆内存,互斥锁/关键部分,文件句柄,套接字)。如果强制线程停止,那么这些资源可能无法释放/解锁,它可能是程序中的其他函数(甚至是你和终止线程使用的C / C ++库代码,例如堆分配函数) )可能会挂起,崩溃或误操作。
我唯一一次考虑线程取消就是当我知道线程正在做一些工作,比如数字运算,并且我仔细地制作或检查了代码,以确保没有进一步的资源获取或锁定....
让线程继续在后台运行终止甚至更好 - 忽略最终结果 - 如果机器没有因为浪费的CPU而感到饥饿。
我想尝试保持我的应用程序的提升,但我知道它支持终止。
无论如何,我认为这不是真的。 boost支持一种合作形式的线程“中断”,但是在线程中运行的代码必须以合理的间隔检查它是否应该继续运行。见http://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html
答案 1 :(得分:0)
以下MSDN链接介绍了如何终止踏板。请注意,这是一个非常激烈的事情......而且你真正想要这样做的原因还不明确(对我而言)。
答案 2 :(得分:0)
至于我,我使用ifdefs for std :: threads来使用特定于平台的代码来终止它们。我经常使用windows和linux,所以
#ifdef _WIN32
#include <Windows.h>
#define killThread(x) TerminateThread(x) // Need to pass std::thread::native_handle()
#else
#include <pthread.h>
#define killThread(x) pthread_close(x)
#endif
答案 3 :(得分:0)
首先:你做不想要杀死一个线程,除非作为真正紧急情况的最后手段(比如,线程已经疯狂,你需要杀死它以保护用户的数据)。当/如果你必须杀死一个线程,你几乎总是希望尽快杀死(并且如果必要的话,重新启动)该进程 - 系统在线程被杀死后无法真正清理,因此它可以离开你的过程处于一个相当(或彻底)不稳定的状态。
因此,如果你想限制DLL使用的时间,你几乎肯定想把它包装成一个可执行文件,所以当它的时间结束时,你可以终止整个过程,然后从那里继续。
而不是仅将其作为一个进程生成,因此您需要直接监视其CPU使用情况,将其放入job object可能更容易。然后,您可以为该进程指定CPU使用限制,Windows将为您处理监视。当进程耗尽其所有CPU时间(以及能够设置其他限制,例如它使用的最大内存,在任何给定时间限制CPU使用率)时,这也为您处理事物提供了(小)更多的灵活性(例如,最多15%的CPU使用率),等等。