线程构建块产生嵌套任务

时间:2017-10-27 18:22:22

标签: c++ multithreading task tbb

大家好,我有以下想法:

我有一个执行阶段1任务的经理任务,之后应该执行阶段2任务。

我收到了以下代码:

execute(){

    set_ref_count(3);
    task* one = new (allocate_child())phase1_task();
    one->set_ref_count(2);
    task*two = new (one->allocate_child())phase2_task();
    spawn(*one);    

    wait_for_all();
    return 0;
}

但不知怎的,我仍然遇到了与refcounter有关的问题...... 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,那么对于您想要的每个阶段1任务,只需执行一个阶段2任务。然后你需要这个:

set_ref_count(5); // for 4 child tasks, plus 1 for waiting

for (int i = 0; i< 4; i++) {
    task* two = new (allocate_child()) phase2_task(ctx, iteration, i);
    two->set_ref_count(1); // for a single child task
    task* one = new (two->allocate_child()) phase1_task(ctx, iteration, i);
    spawn(*one);
}

wait_for_all();

逻辑是“父”任务在其所有“子”任务完成后获得控制权。所以你想要产生第一阶段的任务,但首先要让第二阶段的任务成为“父”,反之则不然。反之亦然。

对于引用计数器:对于父任务,设置与子任务一样多的引用,如果父任务已经执行则添加1,并将调用wait_for_all(),以确保其引用计数没有去0,它不会第二次执行。