退出 TBB 应用程序(任务调度程序)

Posted

技术标签:

【中文标题】退出 TBB 应用程序(任务调度程序)【英文标题】:Exiting TBB application (task scheduler) 【发布时间】:2010-12-04 20:22:27 【问题描述】:

我目前正在使用线程构建块来启动我的最新应用程序,使用任务调度程序。

如果我的一项任务遇到退出程序的原因:

1.) 如何让所有其他任务返回?

2.) 如何在主线程中验证所有其他任务都已返回,以便安全退出应用程序?

谢谢!

【问题讨论】:

【参考方案1】:

问题的第一部分已经回答,您可以使用task cancellation 来阻止任务被安排执行。例如:

tbb::parallel_for(0,100, [](int i)
    for(int j = 0; j < 10000000 && !task::self().is_cancelled(); j++) 
        if( must_stop )
            task::self().cancel_group_execution();
        else
            do_my_work();
    
);

在上面的示例中,主线程将像往常一样等待所有任务终止,因为它是同步类型的 API。但如果您的问题暗示有异步运行的任务,请考虑使用low-level TBB scheduler API 或高级tbb::task_group,例如:

tbb::task_group g;
g.run([] Do_my_work1(); );
g.run([] Do_my_work2(); );
...
g.cancel();
g.wait();

最后,还有阻塞终止预览功能(搜索 TBB_PREVIEW_WAITING_FOR_WORKERS),如果您不仅需要等待任务完成执行,还需要等待 TBB 工作人员终止时,它会有所帮助。

【讨论】:

【参考方案2】:

有很多函数to cancel tasks 和check for cancellation。环顾四周……你会发现更多。

【讨论】:

以上是关于退出 TBB 应用程序(任务调度程序)的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 和 Windows 任务计划程序在退出时重试(1)

Linux计划任务

结合英特尔 IPP 和 TBB

laravel任务调度出现僵尸进程

windows批处理文件不退出

NodeJS 未退出,如何找到打开的处理程序?