我目前正在使用线程构建块来启动我最新的应用程序,使用任务调度程序。
如果我的一项任务遇到退出程序的原因:
1.) 我怎样才能告诉所有其他任务返回?
2.) 我如何在主线程中验证所有其他任务都已返回,以便我可以安全地退出应用程序?
谢谢!
我目前正在使用线程构建块来启动我最新的应用程序,使用任务调度程序。
如果我的一项任务遇到退出程序的原因:
1.) 我怎样才能告诉所有其他任务返回?
2.) 我如何在主线程中验证所有其他任务都已返回,以便我可以安全地退出应用程序?
谢谢!
问题的第一部分已经回答了,您可以使用任务取消来阻止任务被安排执行。例如:
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。但是,如果您的问题暗示有异步运行的任务,请考虑使用低级 TBB 调度程序 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 工作人员终止时,它会有所帮助。