0

我对 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(
            [&]
            {
                ...
            });
    });
4

0 回答 0