【问题标题】:using TBB for non-parallel tasks将 TBB 用于非并行任务
【发布时间】:2012-01-08 06:22:06
【问题描述】:

我想使用 TBB 获得线程池行为。但是每当我阅读有关 TBB 的文档时,他们总是谈论并行,并行执行等。相比之下,我需要一个主线程来将任务分配给线程池,以便这些任务将“自行”执行 - 执行任务异步。这里的任务可以是 GUI 的事件处理。

TBB 任务调度程序是否适合这种行为?我从任务调度程序中得到的印象是,只有当我有可以分解并相互并行执行的任务时,它才是有益的。

【问题讨论】:

  • threadingbuildingblocks.org/documentation.php 下载“设计模式”指南。它特别提到了从 GUI 线程卸载长时间运行的任务(参见第 8 章,“GUI 线程”),并有一个简单的示例说明它是如何完成的。

标签: asynchronous threadpool tbb


【解决方案1】:

从 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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    相关资源
    最近更新 更多