c++ - 一定时间后强制终止方法

标签 c++ linux multithreading c++11 std-future

假设我有一个函数,其原型(prototype)如下所示,属于 container_class 类:

std::vector<int> container_class::func(int param);

该函数可能会或可能不会导致某些输入的无限循环;无法判断哪些输入会成功,哪些会导致无限循环。该函数位于我没有源代码且无法修改的库中(这是一个错误,将在几个月后的下一个版本中修复,但现在我需要一种方法来解决它),所以修改函数或类的解决方案将不起作用。

我已经尝试使用 std::asyncstd::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++线程模型就是基于它。一个进程真的不能成为它自己的线程的调度程序,虽然有时这很痛苦,但事实就是如此。

关于c++ - 一定时间后强制终止方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49494402/

相关文章:

c++ - 无法在 Visual Studio 程序中运行合并排序

linux - 我如何在 Twisted 中处理 POST 请求?

c - 使用 FUSE 在 C 中编写一个简单的文件系统

swift - 弱引用在分派(dispatch)到串行队列后变为 nil

c++ - 串口read()没有接收到数据不返回值

c++ - AVR - 中断 vector 和全局变量

linux - BASH:如何检测最后进入目录的文件? (不是时间戳)

java - 如何在Project Reactor中正确使用Schedulers.single()?

java - Android - 多线程TCP连接

c++ - 我所有的函数都有错误 C2084 : function 'function' already has a body