这就是我想要实现的目标:
我使用TBB's
管道进行处理。我在管道中有几个过滤器,我需要过滤器尽可能快,因为这是一个实时应用程序。其中一个过滤器有时可能需要更长的时间,因此我想以某种方式在特定过滤器上设置超时。
在找了一段时间后,我找到了以下解决方案,该解决方案一般有效,但有问题:
创建过滤器后,我创建了一个事件HANDLE
m_Event = CreateEvent(NULL, FALSE, FALSE, NULL);
然后,过滤器使用异步调用函数并等待事件
...
auto funcBind = std::bind(&MyFunc, ...)
auto function = std::async(std::launch::async, funcBind, m_Event ...);
long res = WaitForSingleObject(m_Event, delayMS);
auto myFuncRes = function.get()
if (res == WAIT_OBJECT_0 && (bool)myFuncRes)
{
// MyFunc Finished successfuly
}
else if (res == WAIT_TIMEOUT)
{
// Timeout expired
}
else
{
// MyFunc failed
}
...
return;
在函数MyFunc
返回之前,它会发出事件信号
SetEvent(event);
现在,如果delayMS
超时到期,TBB过滤器不会延迟整个流水线。问题是MyFunc
仍然在后台运行,它不会停止。
我的问题是,有没有更好的方法在TBB过滤器上设置超时,并且有一个解决方案,一旦达到超时就停止MyFunc
执行(我' d不想在其中使用计时器或计时检查,也许以某种方式使用事件并检查它是否由过滤器或其他东西拍摄)
答案 0 :(得分:3)
是否可以在长时间运行的任务中添加检查点?如果可以,您可以使用task_group
或task_group_context
取消执行任务或执行多项任务。但是,要使其在长时间运行的任务中正常运行,您需要通过tbb::task::self().is_cancelled()
检查取消请求并终止任务执行来手动中断它。
然后,您可以使用其他线程来监视时间并向任务组发送取消请求,这些请求的时间超过允许时间。这样,您的计算可以保持在同一个线程上,因为管道可以减少线程之间切换和同步的开销。
如果您的长时间运行的线程受I / O限制,那么您可以通过引入异步I / O来更好地与TBB交互,并随着时间的推移为您提供所有控制。