在一定时间后强行终止方法

Ale*_*iam 7 c++ linux multithreading c++11 std-future

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

std::vector<int> container_class::func(int param);
Run Code Online (Sandbox Code Playgroud)

该函数可能会或可能不会在某些输入上产生无限循环; 无法确定哪些输入会导致成功,哪些输入会导致无限循环.该函数在一个库中,我没有源代码,也无法修改(这是一个bug,将在几个月内在下一个版本中修复,但是现在我需要一种方法来解决它),所以修改函数或类的解决方案将不起作用.

我尝试使用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);
}
Run Code Online (Sandbox Code Playgroud)

这段代码有很多问题.一个是我无法强制终止std::future对象(以及它所代表的线程).

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

我怎么能做到这一点?有没有比我现在做的更好的方式?

Ser*_*eyA 2

你运气不好,抱歉。

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

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

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