一定时间后强制终止方法
Forcibly terminate method after a certain amount of time
假设我有一个函数,其原型如下所示,属于类container_class
:
std::vector<int> container_class::func(int param);
该函数可能会也可能不会在某些输入上引起无限循环;无法判断哪些输入会导致成功,哪些会导致无限循环。该函数位于一个我没有源代码且无法修改的库中(这是一个错误,将在几个月后的下一个版本中修复,但现在我需要一种方法来解决它),因此修改函数或类的解决方案将不起作用。
我尝试使用std::async
和std::future
隔离函数,并使用 while 循环不断检查线程的状态:
container_class c();
long start = get_current_time(); //get the current time in ms
auto future = std::async(&container_class::func, &c, 2);
while(future.wait_for(0ms) != std::future_status::ready) {
if(get_current_time() - start > 1000) {
//forcibly terminate future
}
sleep(2);
}
这段代码有很多问题。一是我不能强制终止std::future
对象(以及它所代表的线程)。
在极端情况下,如果我找不到任何其他解决方案,我可以将函数隔离在其自己的可执行文件中,运行它,然后检查其状态并适当地终止它。但是,我宁愿不这样做。
我怎样才能做到这一点?有没有比我现在正在做的事情更好的方法?
你运气不好,对不起。
首先,C++甚至不能保证将来会有一个线程来执行。尽管在单个线程中实现所有std::async
保证非常困难(可能不可能),但没有直接禁止这样做,而且,当然也不能保证每个async
调用都有一个线程。因此,无法取消异步执行。
其次,即使在最低级别的线程实现中也没有这种方式。例如,虽然pthread_cancel
存在,但它不会保护您免受不访问取消点的无限循环的影响。
你不能在 Posix 中任意杀死一个线程,C++线程模型都是基于它的。一个进程真的不能成为它自己的线程的调度程序,虽然有时它很痛苦,但它就是这样。
相关文章:
- 等待 qthread 终止的正确方法是什么?
- 初始化和终止Qt应用程序的正确方法?
- 终端进程终止,退出代码为:1有什么方法可以修复它吗
- 是否有一种安全的方法可以断言字符串视图是否以 null 终止?
- 使用信号检测子进程何时终止的最佳方法是什么?
- 一定时间后强制终止方法
- C :终止循环的最优雅方法,该循环在字符串向量上迭代
- 判断哪些线程已终止的有效方法
- 称为终止的纯虚拟方法
- 是否有一种方法可以在输入负数时平均不包括负数,这是您终止程序的方式
- 无法在线程运行方法中运行CryptoPP FileSink的情况下终止Qt线程
- 当 Execute() 在 C++ Builder 中终止时,不会调用 OnTerminate() 方法
- 在 Linux 中监视和终止其他程序停滞进程的更好方法?
- 旧版 Win32 DLL 中的空终止字符串 C++ - 有没有更好的方法
- 使用 Windows 版C++加速终止套接字 WinHttp API 的方法
- 命令在调用方法时终止
- 在字符串附加函数中,null终止无符号字符缓冲区的有效方法
- 当c#程序试图在c++ dll方法中使用cudaMalloc分配超过2GB时终止
- 在x秒后终止正在运行的线程的最佳方法是什么?
- Eclipse CDT——是否有一种方法可以在启动新启动之前终止之前正在运行的启动?