Почему параллельный std :: for_each возвращает void - PullRequest
0 голосов
/ 15 февраля 2019

Я читаю C ++ 17 в деталях .Ниже приведено описание std :: for_each , в этой книге:

В серийной версии for_each, версии, которая была доступна до C ++ 17>, вы получаетеунарная функция как возвращаемое значение из алгоритма.Возврат такого объекта невозможен в параллельной версии, так как порядок> вызовов не определен.

Я все еще понимаю, почему параллельный std :: for_each не может вернутьфунктор е .Хотя порядок вызовов неопределен, параллельный for_each блок ожидания ожидания завершает вызов. Когда каждая параллельная операция завершается, возврат f кажется нормальным.

1 Ответ

0 голосов
/ 15 февраля 2019

Идея возврата функтора заключается в том, чтобы позволить функтору накапливать состояние при последующих вызовах.К накопленному состоянию можно получить доступ через возвращенную копию.

Накопление требует последовательного доступа к накопленному состоянию, что противоречит цели параллельного выполнения.По сути, каждый поток выполнения получит копию объекта функции, и его состояние не будет общим.

Стандарт имеет следующее примечание:

[Примечание: копия не возвращаетсясвоего параметра Function, поскольку распараллеливание может не позволить эффективное накопление состояния.- конец примечания]

...