【问题标题】:In order execution with TBB?用 TBB 执行订单?
【发布时间】:2012-12-16 13:05:47
【问题描述】:

我想要tbb::task_group 之类的东西,但要保证订单执行的不同,例如

serial_task_group tasks;

tasks.run([]{std::cout << 1;});
tasks.run([]{std::cout << 2;});
tasks.run([]{std::cout << 3;});
tasks.wait();

// guaranteed output: 123

关于如何使用 tbb 实现这一点的任何建议?

目前我有一个显式线程,它只使用条件变量从队列中执行。但是,使用队列的问题是我将如何保证 task_group 中只有一个任务处于活动状态。

【问题讨论】:

  • 我真的看不出你想要归档什么。如果我理解正确,您只希望按顺序执行任务,并且一次只执行一项。但在这种情况下,我看不出你需要task_group 做什么。如果您没有并发执行,您可以直接在调用线程/函数中执行您需要的任何操作,而不是委托给task-结构。关于您问题的最后一部分:如果您只有一个线程执行任务,一次如何激活多个任务?
  • @Grizzly:我还有很多其他并发的事情要做。但是,我想在这里运行的特定计算需要按顺序运行并且非常繁重。如果我使用显式线程,而不是使用任务调度程序,由于超额订阅,我会有相当多的开销。我的目标是在任务调度程序中运行所有内容。
  • 你看过tbb流程图吗?在 Windows 上,代理库很容易做到这一点,在 tbb 流图是最接近的等价物。

标签: c++ concurrency tbb


【解决方案1】:

(披露:我在英特尔从事英特尔线程构建模块的工作。)

正如另一个答案中所建议的,您可以使用流程图来做这样的事情。使用流程图的示例代码如下所示:

#include "tbb/flow_graph.h"
#include <iostream>

using namespace tbb::flow;

int main( int argc, char *argv[] ) {
    graph g;
    continue_node< continue_msg > n1( g, []( const continue_msg & ) { std::cout << "1"; } );
    continue_node< continue_msg > n2( g, []( const continue_msg & ) { std::cout << "2"; } );
    continue_node< continue_msg > n3( g, []( const continue_msg & ) { std::cout << "3"; } );
    make_edge( n1, n2 );
    make_edge( n2, n3 );
    n1.try_put( continue_msg() );
    g.wait_for_all();
   return 0;
}

【讨论】:

  • 不是我想要的,但根据您发布的内容,可能是这个,pastebin.com/i2rxGKsP?
  • 是的,这应该可以。由于节点是串行的,它将按顺序接收和执行函数,从不重叠它们的执行。它们将被安排为 TBB 任务,因此能够与系统中的任何其他 TBB 任务同时执行。
  • 必须有一种比必须为要并行执行的每个任务创建一个对象更简单的方法——这可能不可行或完全没有必要。
猜你喜欢
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2016-12-14
  • 2017-10-05
相关资源
最近更新 更多