我想使用 TBB 获得线程池行为。但是每当我阅读有关 TBB 的文档时,他们总是谈论 parallel-for、parallel-dowhile 等。相比之下,我需要一个主线程将任务分配给线程池,以便这些任务将“自行”执行 - 执行任务异步。这里的任务可以是 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 documentation)。
关于asynchronous - 将 TBB 用于非并行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8301827/