Исключительная безопасность и параллелизм в C ++ 11 и более поздних версиях: рекомендации для функций, реализованных в STL - PullRequest
0 голосов
/ 20 сентября 2019

В настоящее время я учусь обрабатывать параллелизм в 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 делает их безопаснее?

Спасибо

Амин

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...