Я думаю, что вы не понимаете, что делает std.parallelism с foreach
.Если вы посмотрите на документацию , в ней будет конкретно указано, что
Прерывание из параллельного цикла foreach с помощью оператора break, помеченного как break, помеченного continue, return или goto генерирует ParallelForeachError.
Таким образом, вы не можете выйти из него в любое время, если не выбросите исключение - что в точности соответствует случаю forall
.Когда вы используете foreach
с parallel
, вы говорите, что нужно распределить итерации этого цикла для разделения потоков.Они почти наверняка распределены в последовательном порядке, но они выполняются параллельно, и вам не очень важен порядок.Если бы вы сделали, вы не могли бы сделать их параллельно.Таким образом, добавление forall
ничего не даст вам здесь.
D по своей природе является последовательным языком, как и большинство языков программирования.Он предоставляет несколько мощных функций, связанных с многопоточностью (например, по умолчанию используется локальное хранилище потоков), но я ожидаю, что потребуется немало редизайна, чтобы поместить что-то вроде forall
непосредственно в язык.И, как оказалось, в этом нет необходимости.Язык достаточно мощный, чтобы допустить параллелизм на его основе.std.parallelism эффективно дает вам forall
.Просто он делает это, используя существующую языковую функцию foreach
вместо того, чтобы изменять язык, чтобы понимать и содержать forall
в качестве встроенной функции.
И, как CyberShadownotes , в работе находится новый модуль std.parallel_algorithm, который будет иметь параллельные версии многих функций в std.algorithm, так что вы получите этот параллелизм бесплатно.В целом, std.parallelism, кажется, делает хорошую работу, предоставляя простые в использовании, но мощные функции параллелизма для D.