在一段时间后强制终止方法

假设我有一个函数,它的原型看起来像这样,属于类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 ++线程模型是基于它的。 一个进程真的不能成为它自己的线程的调度器,虽然有时这是一种痛苦,但它是它的原因。

链接地址: http://www.djcxy.com/p/803.html

上一篇: Forcibly terminate method after a certain amount of time

下一篇: Hierarchical JSON Data to Hierarchical Table