использование TBB для непараллельных задач - PullRequest
4 голосов
/ 29 ноября 2011

Я хочу получить поведение пула потоков, используя TBB. Но всякий раз, когда я читаю документы о TBB, они всегда говорят о параллельности, параллельности и т. Д. В отличие от этого мне нужен главный поток для назначения задач пулу потоков, чтобы эти задачи выполнялись «самостоятельно» - выполняйте задачи асинхронно. Задачи здесь могут быть обработкой событий для GUI.

Подходит ли планировщик задач TBB для такого поведения? У меня сложилось впечатление от планировщика задач, что это полезно только в том случае, если у меня есть задачи, которые можно разбивать и выполнять параллельно друг другу.

1 Ответ

10 голосов
/ 01 февраля 2012

Начиная с версии 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 для обоих).

...