1

我正在将 tbb 用于某些项目,并且我被迫使用 tbb 任务。

我的程序有 N 个任务,它们是交互的。

伪代码如下:

class Task;

Task* t[N];

class Task {
    startTask(Task &t) {
        t.notify();
    }
    execute() {
        while(!end){
            if(some condition 1)
                wait();

            for(i = 0; i < N; ++i)
                if(some condition 2)
                    startTask(*t[i]);

            if(some condition 3)
                end = true;
        }
    }
};

N >> 核心

如果我为此作业使用 condition_variable,则线程停止并且线程停止所有任务。有什么方法可以用来完成我的工作吗?

我试图使用回收,但只有 CORE_NUMBER 任务在工作,其他 N-CORE_NUMBER 任务永远不会开始执行。

此致,

戈兰

4

1 回答 1

4

(免责声明:我为英特尔工作并使用英特尔® 线程构建模块)

是的,TBB 任务是非抢占式的,它们被安排到固定数量的工作线程上。因此,如果您在所有工作线程上都有任务并且所有这些任务都在等待,那么您将死锁。由于所有工作线程都忙于执行(阻塞)任务,因此无法安排其他任务来唤醒其他任务。

我能想到的几点:

  1. 您能否重新构建您的应用程序,以便仅在满足其等待条件时才生成任务?您的伪代码似乎表明您生成了任务,然后它检查它是否可以继续。您可以仅在任务能够完成时安排任务,而不是阻塞任务吗?
  2. 如果您知道允许执行任务的顺序,您可以创建任务图(​​http://software.intel.com/sites/products/documentation/doclib/tbb_sa/help/hh_goto.htm#tbb_userguide/ General_Acyclic_Graphs_of_Tasks.htm)。
  3. 您可以使用流程图在 TBB 中实现流式处理和反应式应用程序。是否可以将其实现为流程图?(http://www.drdobbs.com/tools/the-intel-threading-building-blocks-flow/231900177

您能否提供有关条件的更多详细信息?你的伪代码很抽象,所以我的建议可能有点离题……</p>

于 2013-01-04T23:12:07.650 回答