4

我正在用 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 */ 
}
4

3 回答 3

4

你不能安全地做到这一点。实际上,您应该预期互斥锁会失败,并且内存会泄漏。因此,没有标准的 C++ 函数。

通常每个操作系统都提供专门的函数来杀死一个线程,但是当应用程序关闭时应该使用这些函数,并且你已经卡住了阻塞程序退出的线程。在这些情况下,无论如何都没有正常工作的线程,内存泄漏不再重要。

于 2015-08-28T08:14:26.000 回答
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;
}
于 2015-08-28T07:45:30.593 回答
0

我将继续实现一个简单的事件循环,并使“限时”函数将其工作分成块,并定期检查在超时或另一个终止请求后事件循环中是否未发出停止事件。

这种方法的开销很小,但允许以最干净的方式中断工作。

如果您想驱动诸如进度条之类的东西以在等待时间为用户提供线索,您还可以使用事件循环发回函数的进度。

或者,您可以实现一个计数器来跟踪无限循环或递归,并在超过阈值后简单地返回。或者一个计时器并在经过的时间少于 10 秒时完成工作。

缺点 - 任何中断功能的安全方法都必须在其中。所以你必须打开并破解那个黑匣子。

于 2015-08-28T08:28:53.390 回答