线程构建块产生嵌套任务

Posted

技术标签:

【中文标题】线程构建块产生嵌套任务【英文标题】:Threading Building Blocks spawn nested tasks 【发布时间】:2017-10-27 18:22:22 【问题描述】:

大家好,我有以下想法:

我有一个管理器任务,它产生一个阶段 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】:

如果我对您的理解正确,对于您想要的每个阶段 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,它不会第二次执行。

【讨论】:

非常感谢 :)

以上是关于线程构建块产生嵌套任务的主要内容,如果未能解决你的问题,请参考以下文章

如果任务产生不同的线程,Serial DispatchQueue 会等待吗

具有永久任务/线程的 TPL 数据流块

java -- 线程

多线程的概念

Runable

线程构建块和图形处理单元