很抱歉,我似乎没有得到英特尔的 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++ 线程池,因为它似乎没有积极开发)?