&引用;限时;函数C++; 我在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 */ } for(int i=0;i

&引用;限时;函数C++; 我在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 */ } for(int i=0;i,c++,time-limiting,C++,Time Limiting,在Windows平台上可能的解决方案。使用风险自负:p(TerminateThread本身就是不安全的) #包括 #包括 模板 bool time_limited_exec(Func Func,DWORD time_limited){ 标准:螺纹螺纹(func); 布尔=假; if(WaitForSingleObjectEx(thread.native\u handle(),time\u limit,TRUE)!=WAIT\u oObject\u 0){ 中断=真; TerminateThrea

在Windows平台上可能的解决方案。使用风险自负:p(
TerminateThread
本身就是不安全的)

#包括
#包括
模板
bool time_limited_exec(Func Func,DWORD time_limited){
标准:螺纹螺纹(func);
布尔=假;
if(WaitForSingleObjectEx(thread.native\u handle(),time\u limit,TRUE)!=WAIT\u oObject\u 0){
中断=真;
TerminateThread(thread.native_handle());
}
thread.join();
返回中断;
}

< /代码> 您不能安全地做到这一点。实际上,您应该预期互斥体会失败,内存会泄漏。为此,没有标准的C++函数。


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

我会继续执行并实现一个简单的事件循环,并且使用“time limited”函数将其工作划分为多个块,并定期检查超时或其他终止请求后事件循环中是否未发出停止事件

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

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

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


缺点-任何安全的中断函数的方法都必须在其中。因此,您必须打开并破解该黑匣子。

当然,只需让您的函数记录开始执行的时间,然后定期让它检查当前时间并从中减去开始时间。如果减去的结果很大比某个指定的值返回。这是一个好主意,但同样,我使用这个函数作为一个黑盒,所以如果它进入一个无限循环,它将不会进入下一个“检查”“……我不能向该函数添加命令:/启动一个新线程来运行您的函数,并且在时间限制超过时杀死它。@灵溪镇,它听起来像是一个好的解决方案,您能在这里添加一个示例代码吗?我从来没有使用C++中的线程:WiMele: C++有官方的ISO标准,因此是官方规则。除非有其他资格。(例如ISO/IEC 14882:1998)当前的标准是隐含的。当前的标准是ISO/IEC 14882:2014,又名C++14。C++11实际上意味着“不是新的东西”。如果你的意思是“只是20世纪的东西”,请将其标记为C++98。
#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;
}