c++ - 线程构建 block 生成嵌套任务

标签 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 任务,然后只执行一个阶段 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 任务,但首先要使阶段 2 任务成为它们的“父级”任务,而不是相反。

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

关于c++ - 线程构建 block 生成嵌套任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46981271/

相关文章:

java - 什么时候需要担心线程安全?

python - 从脚本运行服务器后 Tkinter 窗口卡住

java - 监听某些变化并将其更新到数据库

C++ 函数指针作为参数和类?

android - 具有path/android-priority-jobqueue或AsyncTask的Android多线程客户端套接字

c++ - 类型别名中的详细类型说明符

c# - 即使只有一项,也会触发两项任务,使用 async/await 和 Task.WhenAll

android-activity - 如何检查 android Lollipop 中的 Activity 是否被锁定(应用固定)

c++ - 使用仿函数子类化窗口 (Win32)

c++传递大 vector 作为输出