Выход из приложения TBB (планировщик задач) - PullRequest
1 голос
/ 04 декабря 2010

В настоящее время я использую строительные блоки для запуска моего новейшего приложения, используя планировщик задач.

Если одна из моих задач сталкивается с причиной выхода из программы:

1.) Как я могу сказать всем остальным задачам вернуться?

2.) Как я могу проверить в главном потоке, что все другие задачи возвращены, чтобы я мог безопасно выйти из приложения?

Спасибо!

Ответы [ 2 ]

1 голос
/ 27 апреля 2014

На первую часть вопроса уже дан ответ, вы можете использовать отмену задачи , чтобы остановить запланированное выполнение задачи. E.g.:

tbb::parallel_for(0,100, [](int i){
    for(int j = 0; j < 10000000 && !task::self().is_cancelled(); j++) {
        if( must_stop )
            task::self().cancel_group_execution();
        else
            do_my_work();
    }
});

В приведенном выше примере основной поток будет ожидать завершения всех задач, как обычно, поскольку это синхронный тип API. Но если ваш вопрос подразумевает, что существуют асинхронно выполняемые задачи, рассмотрите возможность использования низкоуровневого API планировщика TBB или высокоуровневого tbb :: task_group вроде:

tbb::task_group g;
g.run([]{ Do_my_work1(); });
g.run([]{ Do_my_work2(); });
...
g.cancel();
g.wait();

И, наконец, есть функция предварительного просмотра блокировки (поиск TBB_PREVIEW_WAITING_FOR_WORKERS), которая может помочь, если вам нужно не только дождаться окончания выполнения задач, но и дождаться завершения работы работников TBB.

0 голосов
/ 05 марта 2011

Существует множество функций для отмены задач и , проверка на отмену .Оглянись вокруг ... найдешь больше.

...