我对 tbbparallel_for()
和task_group::run()
. 我有一个代码,它使用task_group::run()
. 在这个任务中,我parallel_for()
用来并行化一个函数。
另一方面,在主线程上,我进行其他计算,并且在某些时候,我还调用 aparallel_for()
来处理其他内容。我遇到的问题是 tbb 重用第二个东西的“主线程”来调用代码启动之前group
(不调用wait()
on group
)。
就我而言,它会产生问题,我不希望第一个任务在主线程上进行一些调用。原因是由于 UI 问题,我有一些代码测试我们是否在主线程上,以更新一些 UI 内容。在这种特定情况下,第二次更新 UIparallel_for()
会导致问题。
这是代表问题的代码:
using namespace std::chrono_literals;
tbb::task_group group;
auto mainThreadId = std::this_thread::get_id();
std::atomic<bool> needWait(true);
std::atomic<bool> taskOnThreadFinish(false);
group.run(
[&]
{
eastl::vector<int> values(20, 0);
tbb::parallel_for_each(
values.begin(),
values.end(),
[&](int i)
{
while(needWait)
std::this_thread::sleep_for(1ms);
// Should never, ever, never be call on the main thread, but it could be the case in TBB !!!!!!
assert(mainThreadId != std::this_thread::get_id());
std::this_thread::sleep_for(1ms);
});
taskOnThreadFinish = true;
});
eastl::vector<int> mainThreadValues(10, 0);
tbb::parallel_for_each(
mainThreadValues.begin(),
mainThreadValues.end(),
[&](int i)
{
needWait = false;
std::this_thread::sleep_for(1ms);
});
while(!taskOnThreadFinish)
std::this_thread::sleep_for(1ms);
所以我的问题是:当第二次调用 tbb::parallel_for_each() 完成时,如何避免重用主线程?
请注意,使用新的 std 并行函数/行为的代码运行良好。
更新
使用 tbb::task_arena 解决了这个问题,因为它隔离了 arena 内的 task_group。
tbb::task_group arena;
tbb::task_group group;
...
arena.execute(
[&]
{
group.Run(
[&]
{
...
});
});