我想使用 TBB 获得线程池行为。但是每当我阅读有关 TBB 的文档时,他们总是谈论并行,并行执行等。相比之下,我需要一个主线程来将任务分配给线程池,以便这些任务将“自行”执行 - 执行任务异步。这里的任务可以是 GUI 的事件处理。
TBB 任务调度程序是否适合这种行为?我从任务调度程序中得到的印象是,只有当我有可以分解并相互并行执行的任务时,它才是有益的。
我想使用 TBB 获得线程池行为。但是每当我阅读有关 TBB 的文档时,他们总是谈论并行,并行执行等。相比之下,我需要一个主线程来将任务分配给线程池,以便这些任务将“自行”执行 - 执行任务异步。这里的任务可以是 GUI 的事件处理。
TBB 任务调度程序是否适合这种行为?我从任务调度程序中得到的印象是,只有当我有可以分解并相互并行执行的任务时,它才是有益的。
从 3.0 版本开始,TBB 支持异步执行任务。为此,tbb::task::enqueue()
增加了一种特殊的工作提供方法。与此不同tbb::task::spawn()
的是,此方法保证即使发起线程从未进入诸如wait_for_all()
.
一个简短的用法示例task::enqueue()
:
class MyTask : public tbb::task {
/*override*/ tbb::task* execute() {
// Do the job
return NULL; // or a pointer to a new task to be executed immediately
}
};
MyTask* t = new (tbb::task::allocate_root()) MyTask();
tbb::task::enqueue(*t);
// Do other job; the task will be executed asynchronously
正如评论中提到的@JimMishell,可以在“设计模式”中找到如何使用它来处理 GUI 事件的示例;参考手册中提供了该方法的正式描述(请参阅两者的TBB 文档)。