线程构建块生成嵌套任务
Threading Building Blocks spawn nested tasks
大家好我有以下想法:
我有一个生成阶段 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;
}
但不知何故,我仍然遇到了引用计数器的问题......
有人可以帮助我吗?
如果我没理解错的话,对于你想要的每个阶段 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();
逻辑是 "parent" 任务在其所有 "child" 任务完成后获得控制权。因此,您想生成阶段 1 任务,但首先将阶段 2 任务设为 "parent",反之亦然。
关于引用计数器:对于父任务,设置与子任务一样多的引用,如果父任务已经执行并将调用wait_for_all()
,则加1,以确保其引用计数不为0,不会执行第二次。
大家好我有以下想法:
我有一个生成阶段 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;
}
但不知何故,我仍然遇到了引用计数器的问题...... 有人可以帮助我吗?
如果我没理解错的话,对于你想要的每个阶段 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();
逻辑是 "parent" 任务在其所有 "child" 任务完成后获得控制权。因此,您想生成阶段 1 任务,但首先将阶段 2 任务设为 "parent",反之亦然。
关于引用计数器:对于父任务,设置与子任务一样多的引用,如果父任务已经执行并将调用wait_for_all()
,则加1,以确保其引用计数不为0,不会执行第二次。