有些时候我们要执行的任务耗时不仅不可预期甚至可能永远执行不完,比如执行用用户输入的一条指令,在Linux上ping就是永远执行不完的。如果我们的设计是顺序执行,必须等待执行完毕才能继续下一个流程,那么程序就卡死在这里了。
这当然不能接受,那么我们就需要一个限制任务执行时间的机制。当然我们可以设计一个复杂的并行处理机制,不过在不改变程序框架的情况下如何做呢?
目录
代码
我们可以用一个线程来执行任务,同时等待任务结束,如果超过时间限制就强制终止线程的执行。
代码如下:
#include <future>
#include <pthread.h>
bool fun(a,b,c)
{
this->
//这是要执行的任务,有参数a、b、c需要传递
}
//成员变量
int m_overtime=30;//超时设置
====================================================
//以下代码可以位于类中的任何一个函数
promise<bool> p;
auto future = p.get_future();
thread* process_thread = new thread([&p, this, a, b, c]//因为里面用到所在类的成员变量,也需要捕获this
{
p.set_value(fun(a,b,c));
});
bool ret;
time_t t1 = time(NULL);
while (true)
{
if (time(NULL) - t1 < m_overtime)
{
auto status = future.wait_for(chrono::milliseconds(1));
if (status == std::future_status::ready)
{
ret = future.get();
break;
}
}
else
{
thelog << "处理超时" << ende;
pthread_cancel(process_thread->native_handle());//终止线程(C++11并没有提供可用方法)
break;
}
}
process_thread->join();
知识点
promise和future
promise代表线程间交互的对象,可以在一个线程中设置,另一个线程中获取,future与promise对象关联,可以等待promise对象。
循环等待
程序中循环等待future准备好,也就是fun函数运行结束,如果超时就强制结束线程。
我这里用的是一秒钟一次的等待,看起来在future.wait_for()这里直接用超时设置就可以了,不用循环,其实是预留在这里检查别的东西,比如检查退出标志,以便立即结束任务。
强制结束线程
C++并没有强制结束线程的方法,所以只能用posix线程库的功能来实现。
线程被强制结束后仍然需要join。
(这里是结束)