我正在用C ++编写代码,并对参数进行详尽的搜索。问题是,对于某种参数,函数可能进入无限循环,我无法控制它(不是我的函数,将它用作黑盒子)。我的问题是,我可以运行带有“时间限制”的函数,所以在10秒之后,从函数中止并移动到下一次迭代吗?
for(int i=0; i < 100; i++){
aBlackBoxFunction(i);
/* This function may goes into a infinite loop :(
I want that if it won't end after 10 seconds, the function would abort and move to the next iteration. I can't change the function itself */
}
答案 0 :(得分:4)
你无法安全地做到这一点。实际上,你应该期望互斥量失败,内存泄漏。因此,没有标准的C ++函数。
通常每个操作系统都提供了杀死线程的专用函数,但是当应用程序正在关闭时应该使用这些函数,并且您已经阻止线程阻止程序退出。在这些情况下,无论如何都没有正常运行的线程,并且内存泄漏不再重要。
答案 1 :(得分:1)
Windows平台上的可能解决方案。使用风险自负:P(TerminateThread
本来就不安全。)
#include <thread>
#include <windows.h>
template <typename Func>
bool time_limited_exec(Func func, DWORD time_limit) {
std::thread thread(func);
bool interrupted = false;
if (WaitForSingleObjectEx(thread.native_handle(), time_limit, TRUE) != WAIT_OEBJECT_0) {
interrupted = true;
TerminateThread(thread.native_handle());
}
thread.join();
return interrupted;
}
答案 2 :(得分:0)
我会继续实施一个简单的事件循环,并使'时间有限&#34;函数将其工作划分为块并定期检查在超时或其他终止请求之后是否在事件循环中未发出停止事件。
这种方法开销很小,但允许以最干净的方式中断工作。
您还可以使用事件循环发回该功能所取得的进展,如果您想要像进度条那样驱动用户在等待时间提供线索。
或者,您可以实现一个计数器来跟踪无限循环或递归,并在超过阈值后简单地返回。或者计时器,并且在经过的时间少于10秒时工作。
缺点 - 任何安全的中断功能都必须在其中。所以你必须打开并破解那个黑盒子。