簡體   English   中英

超時TBB管道過濾器

[英]Timeout a TBB pipeline filter

這就是我想要實現的目標:

我正在使用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的執行(我不想在其中使用定時器或定時檢查,也許以某種方式使用該事件並檢查它是否由過濾器或其他東西采取)

是否可以在長期運行的任務中添加檢查點? 如果可以,則可以使用task_grouptask_group_context取消任務或多個任務的執行。 但是,要使其在長時間運行的任務中正常運行,您需要通過tbb::task::self().is_cancelled()檢查取消請求並終止任務執行來手動中斷它。

然后,您可以使用其他線程來監視時間並向任務組發送取消請求,這些請求的時間超過允許時間。 這樣,您的計算可以保持在同一個線程上,因為管道減少了線程之間切換和同步的開銷。

如果您的長時間運行的線程受I / O限制,那么您可以通過引入異步I / O來更好地與TBB交互,並隨着時間的推移為您提供所有控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM