假设我有一个原型如下所示的函数,属于类container_class
:
std::vector<int> container_class::func(int param);
该函数可能会或可能不会在某些输入上产生无限循环;无法确定哪些输入会导致成功,哪些输入会导致无限循环。该函数在一个库中,我没有源代码,也无法修改(这是一个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);
}
此代码存在许多问题。一个是我无法强制终止std::future
对象(以及它所代表的线程)。
在最极端的情况下,如果我找不到任何其他解决方案,我可以在自己的可执行文件中隔离该函数,运行它,然后检查其状态并适当地终止它。但是,我宁愿不这样做。
我怎样才能做到这一点?有没有比我现在做的更好的方式?
答案 0 :(得分:2)
你运气不好,抱歉。
首先,C ++甚至不能保证会有一个线程供将来执行。虽然在单个线程中实现所有class ShopView(viewsets.ModelViewSet):
queryset = Shop.objects.all()
serializer_class = ShopSerializer
保证会非常困难(可能是不可能的),但是没有直接禁止这一点,而且,肯定不能保证每个{{1}都有一个线程调用。因此,无法取消异步执行。
其次,即使在最低级别的线程实现中也没有这种方式。虽然std::async
存在,但它不会保护您免受无法访问取消点的无限循环,例如。
你不能在Posix中任意杀死一个线程,而C ++线程模型就是以它为基础的。一个过程实际上不能成为它自己的线程的调度程序,虽然有时它是一个痛苦,它就是它。