C++:如何实现任意函数调用的超时?

Fra*_*ank 27 c++ timeout function abort

我不得不调用一个有时不会在给定时间内终止的库函数.有没有办法调用该函数,但如果它在n几秒钟内没有终止就中止它?

我无法修改函数,所以我不能直接将中止条件放入其中.我必须在外部为函数添加超时.

它可能是一个可能的解决方案,将其作为(提升)线程启动,然后我可以在一段时间后终止它?会有类似的东西吗?我实际上认为该函数不是线程安全的,但如果我将它作为唯一的单线程运行则无关紧要,对吧?还有其他(更好的)解决方案吗?

Ben*_*aub 18

你可以产生一个boost::thread来调用API:

boost::thread api_caller(::api_function, arg1, arg2);
if (api_caller.timed_join(boost::posix_time::milliseconds(500)))
{
    // API call returned within 500ms
}
else
{
    // API call timed out
}
Run Code Online (Sandbox Code Playgroud)

但是,Boost不允许你杀死工作线程.在这个例子中,它只是孤儿.

你必须要小心API调用的作用,因为它可能永远不会释放它所获得的资源.


An̲*_*rew 15

我认为实现这一目标的唯一安全方法是生成一个单独的沙箱进程,该进程将库函数作为应用程序的代理调用.您需要在应用程序和代理之间实现某种类型的IPC.在读取IPC回复时实现超时非常简单.如果读取因超时而失败,则可以安全地终止代理,而不会危及应用程序的运行状况.


Dou*_* T. 8

你所说的通常被称为"看门狗"系统.监视程序通常是第二个线程,它检查所有其他线程的状态.看门狗通常设置为定期运行.如果没有收到来自其他线程的响应,则监视程序可以通知用户,或者如果可以安全地(取决于您的应用程序)可以杀死有问题的线程.

  • 根据库函数的作用,查找无响应的线程可能非常不安全.一种安全的方法是将任务分配给一个单独的过程. (4认同)