【发布时间】:2012-05-14 23:50:58
【问题描述】:
很抱歉,我似乎没有得到intel's TBB,它看起来很棒且受支持,但我无法理解如何使用它,因为我想我不习惯从以下方面考虑并行性任务,而是将其视为线程。
我当前的工作负载有一个作业将工作发送到队列以继续处理(考虑递归,但不是调用自身,而是将工作发送到队列)。我在 Java 中进行这项工作的方式是创建一个并发队列(非阻塞队列)和线程池执行器,用于处理队列/将工作发送回它。但是现在我正在尝试在 C++ 中做类似的事情,我发现 TBB 可以创建池,但它的方法非常不同(Java 线程似乎只要它们在队列中工作就可以继续工作,但 TBB 似乎打破了任务开头)。
这是我所做的一个简单的 Java 示例(在此之前我设置了我想要的线程数等):
static class DoWork implements Callable<Void> {
// queue with contexts to process
private Queue<int> contexts;
DoWork(Context request) {
contexts = new ArrayDeque<int>();
contexts.add(request);
}
public Void call() {
while(!contexts.isEmpty()) {
//do work
contexts.add(new int(data)); //if needs to be send back to the queue to do more work
}
}
}
我确定它可以在 TBB 中执行此操作,但我只是不确定如何,因为它似乎在我发送它时破坏了我的工作。因此,如果队列中有 2 个项目,它可能只会启动 2 个线程,但不会随着更多工作的进入而增长(即使我有 8 个内核)。
有人可以帮助我了解如何完成我的任务,还可以建议一种更好的方法来考虑来自使用 Java 线程环境的 TBB(我也不忠于 TBB,所以如果有更容易/更好的东西,那么我就是很高兴学习它。我只是不喜欢 c++ 线程池,因为它似乎没有积极开发)?
【问题讨论】:
-
Context数据类型是什么?课程最初是DoWork<Context>吗? -
@moshbear 为简单起见,我只是在示例中将其设为 int。当我真正这样做时,它是一个 int 和一个列表。抱歉应该在示例中将其转换为 int。
-
这是您的代码的 STL 翻译:codepad.org/vs4S1UtB。你应该从那里去。
-
@moshbear 非常感谢。我真的很抱歉,我知道如何设置队列,我的问题更多是关于让线程使用池处理它,因为队列的大小是动态变化的..
标签: c++ multithreading tbb