Выход из приложения TBB (планировщик задач)

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

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

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

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

Спасибо!


person oneminute    schedule 04.12.2010    source источник


Ответы (2)


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

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.

person Anton    schedule 27.04.2014

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

person Nav    schedule 05.03.2011