Обычно я использую OpenMP для распараллеливания задач.Тем не менее, я подумал, что мог бы дать возможность библиотеке Parallel Patterns Library, когда недавно начал работать над новым проектом.
Проблема заключается в том, что мне нужно хранить данные в структуре списка, который будет иметь разные размеры на протяжении всего процесса.Я мог распараллелить списки с OpenMP с созданием задач для каждой итерации, и я попытался выполнить то же самое с помощью следующего кода
#include <list>
#include <ppl.h>
#include <iostream>
#include <Windows.h>
using namespace std;
using namespace Concurrency;
void expo(double x){
double r = 1;
for(int i = 0 ; i<1000000 ; ++i){
r *= x;
}
cout << r << " ";
}
int wmain()
{
int begin,end;
list<int> numbers;
for(int i=1; i<11 ; ++i){
numbers.push_back(i);
}
list<int>::iterator lit;
structured_task_group tasks;
begin = GetTickCount();
for(lit=numbers.begin() ; lit!=numbers.end() ; lit++){
int k = *lit;
auto task1 = make_task([&k](){ expo(k); });
tasks.run(task1);
tasks.wait();
}
end = GetTickCount();
printf("elapsed: %d ms",end - begin);
cin.get();
return 0;
}
Но, как вы можете видеть, я должен дождаться завершениязадача внутри цикла for, которая подразумевает последовательное выполнение.Если я помещаю «tasks.wait ()» после цикла for, я получаю сообщение об ошибке, и компилятор говорит, что после команды run отсутствует команда ожидания.
Как обойти эту проблему?
Кстати, знаете ли вы какой-нибудь хороший учебник по PPL?Я нашел эту страницу (http://msdn.microsoft.com/en-us/library/dd492418.aspx), которая не казалась мне идеальным учебником для начинающих.
Заранее спасибо!