В настоящее время я учусь обрабатывать параллелизм в C ++ 11 и более поздних версиях.В качестве ссылки я выбрал книгу под названием «Параллельность C ++ в действии», в которой упоминается, что при разработке параллельных алгоритмов, скажем, для реализации параллельного накопления элементов в контейнере, следует уделять особое внимание безопасности исключений.В частности, что текущая структура:
template<typename Iterator,typename T>
struct accumulate_block
{
void operator()(Iterator first,Iterator last,T& result)
{
result=std::accumulate(first,last,result);
}
};
, если вызывается в следующей параллельной функции:
template<typename Iterator,typename T>
T parallel_accumulate(Iterator first,Iterator last,T init)
{
// some code....
std::vector<T> results(num_threads);
std::vector<std::thread> threads(num_threads-1);
Iterator block_start=first;
for(unsigned long i=0;i<(num_threads-1);++i)
{
Iterator block_end=block_start;
std::advance(block_end,block_size);
threads[i]=std::thread(
accumulate_block<Iterator,T>(),
block_start,block_end,std::ref(results[i]));
block_start=block_end;
}
// more code...
}
Утверждается, что такой код не является безопасным для исключения , потому что std :: накопить в структуре может выдать, и предлагает использовать packaged_tasks и std :: futures для перемещения исключений между потоками, а не вышеупомянутой реализации.
Моя точка зрения: как я могу измерить, какие методыв STL, и как «перетаскивание» их внутри фьючерсов и packaged_tasks делает их безопаснее?
Спасибо
Амин