7

假设我有一个原型看起来像这样的函数,属于类container_class

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

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

我尝试使用std::asyncand隔离函数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对象(以及它所代表的线程)。

在最极端的情况下,如果我找不到任何其他解决方案,我可以将函数隔离在它自己的可执行文件中,运行它,然后检查它的状态并适当地终止它。但是,我宁愿不这样做。

我怎样才能做到这一点?有没有比我现在做的更好的方法?

4

1 回答 1

2

你运气不好,对不起。

首先,C++ 甚至不保证你将来会有一个线程来执行。std::async尽管在单个线程中实现所有保证非常困难(可能是不可能的) ,但没有直接禁止这样做,而且肯定不能保证每次async调用都会有一个线程。因此,无法取消异步执行。

其次,即使在最低级别的线程实现中也没有这种方法。例如,虽然pthread_cancel存在,但它不会保护您免受不访问取消点的无限循环的影响。

Posix 中不能任意杀死线程,C++ 线程模型就是基于它。一个进程真的不能成为它自己线程的调度程序,虽然有时它很痛苦,但它就是这样。

于 2018-03-26T15:01:53.697 回答