2016-01-02 4 views
0

этот вопрос похож на How to get return value from a function called which executes in another thread in TBB?, но я работаю с задачами.TBB/Threading Building Blocks: получение возвращаемого значения из задачи

У меня есть следующий код:

vector<vector<int> > all; 
for(h=0; h<100;h++){ 
    vector<int> vector1= Node(anotherVector[h], value - 1, anotherVector[h].size()); 
    for (unsigned int u = 0; u < vector1.size(); u++) { 
     all[h].push_back(vector1[u]); 
    } 
} 

«Vector1» сохраняет результат рекурсивного вызова от узла. Я хочу, чтобы TBB вызывал узел параллельно. А затем использовать «vector1», чтобы подтолкнуть его к «все». Моя проблема заключается в том, что если я пытаюсь использовать задачи, мне нужно вернуть объект Task из Node, чтобы использовать spawn_and_wait_for_all (taskobjectlist здесь).

Заранее благодарим за любую помощь.

ответ

3

Это не прямой ответ на ваш вопрос, потому что, как сказано, это имеет меньшее значение для меня. Итак, несколько примечаний.

tbb::task - это низкоуровневый интерфейс, который обычно не рекомендуется для использования, если вы не знаете, что делаете. Например, spawn_and_wait_for_all(task_list) неэффективен для длинных списков (> 10). Рекурсивный параллелизм, такой как разделение и захват, и особенно работа с векторами, может быть реализован с использованием tbb::parallel_reduce или если вы хотите использовать только задачи, посмотрите на tbb::task_group или tbb::parallel_invoke. Обратите также внимание, что std:vector не позволяет одновременно выполнять безопасный одновременный push_back() из разных задач, он не является потокобезопасным. Вместо этого вы можете попробовать tbb::concurrent_vector<>, но я бы предпочел сначала попробовать tbb::parallel_reduce или tbb::combinable.

+0

Hi Anton, благодарит за советом. Я смотрел немного дальше, но не могу найти что-то, что работает. Например, когда я использую task_groups, код может быть таким: g-> run (Node (anotherVector [h], value - 1, anotherVector [h] .size())); g-> wait(); У меня нет возможности получить возвращенный результат этой задачи. – Christian

+0

Задача может содержать ссылку на структуру вывода. Не нужно возвращать что-то вроде функционального программирования. – Anton

+0

Где я могу узнать больше об этом? Есть ли где-нибудь пример? Благодаря! – Christian