我是第一次使用TBB,希望运行一系列完全独立的任务。我想使用tbb:: task ::enqueue,即我创建一个根任务,它创建一个独立于父任务的子任务。这个子级可以再次创建任务,依此类推。
我的解决方案不起作用,因为子任务再次调用父任务,而我得到了一个无穷无尽的级联。根任务的执行是有效的,但是一旦创建子任务,就会有一个无穷无尽的级联。
// initialization
tbb::task::enqueue( *new( tbb::task::allocate_root() ) tbbwrapper::ctask( <some data> ) );
// execute method
tbb::task* ctask::execute()
{
<execute data processing>
return <data result correct>
? new( this->allocate_child() ) tbbwrapper::ctask( <result data> )
: NULL;
}我有很多任务(所有任务都是独立的,执行顺序也是完全独立的)要运行,每个任务都可以创建一个后继任务,但它是完全独立的,只需要添加到队列中即可运行。我也不需要等待或类似的东西,因为执行应该在后台运行。
我只需要一个简单的例子来说明它是如何工作的。
发布于 2019-07-13 17:46:57
通常不建议直接使用TBB任务接口,因为该接口过于复杂,且存在大量隐患。如果你事先知道任务的数量,你可能会想要使用tbb::parallel_for。如果您想在算法执行过程中添加任务,可以使用tbb::parallel_do的feeder功能。如果您不想使用算法,而希望使用任务进行操作,请考虑使用tbb::task_group。
即使应用程序结束,也不需要等待后台工作完成吗?您可以使用tbb::task_group创建后台任务,例如
tbb::task_group tg;
// Run parallel_for in background.
tg.run( [] {
tbb::parallel_for(...);
} );
// ...
// Any other code
// ...
tg.wait(); // task_group requires to call `wait` to guarantee that all tasks are really processed如果您想要保证后台工作的并发执行,您可以将唯一一个将与其他TBB算法一起创建额外工作的任务排入队列。
更新
考虑一下在后台运行函数的run_task助手。
#include "tbb/task.h"
#include <iostream>
#include <thread>
template <typename F>
class task_wrapper : public tbb::task {
F f_;
public:
task_wrapper(F f) : f_(f) {}
tbb::task* execute() override {
f_();
return NULL;
}
};
template <typename F>
void run_task(F f) {
tbb::task::enqueue(*new(tbb::task::allocate_root()) task_wrapper<F>(f));
}
int main() {
for (int i = 0; i < 10; ++i) {
run_task([i] {
std::cout << i << std::endl;
});
}
// Give time to proceed the background tasks.
using namespace std::chrono_literals;
std::this_thread::sleep_for(1s);
return 0;
}https://stackoverflow.com/questions/56992287
复制相似问题