超时TBB管道过滤器

时间:2016-11-24 06:42:01

标签: c++ synchronization pipeline tbb

这就是我想要实现的目标:

我使用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不想在其中使用计时器或计时检查,也许以某种方式使用事件并检查它是否由过滤器或其他东西拍摄)

1 个答案:

答案 0 :(得分:3)

是否可以在长时间运行的任务中添加检查点?如果可以,您可以使用task_grouptask_group_context取消执行任务或执行多项任务。但是,要使其在长时间运行的任务中正常运行,您需要通过tbb::task::self().is_cancelled()检查取消请求并终止任务执行来手动中断它。

然后,您可以使用其他线程来监视时间并向任务组发送取消请求,这些请求的时间超过允许时间。这样,您的计算可以保持在同一个线程上,因为管道可以减少线程之间切换和同步的开销。

如果您的长时间运行的线程受I / O限制,那么您可以通过引入异步I / O来更好地与TBB交互,并随着时间的推移为您提供所有控制。