Я полагаю, вы используете std.parallelism?Я написал std.parallelism, так что я позволю вам принять дизайнерское решение.На самом деле в некоторых бета-версиях стандартного параллелизма была функция join
.Он подождал, пока все задачи не были завершены, а затем завершил работу пула задач.Я удалил его, потому что понял, что это бесполезно.
Причина в том, что если вы вручную создаете набор объектов O (N) task
для итерации по некоторому диапазону, вы неправильно используете библиотеку.Вместо этого вы должны использовать параллельный цикл foreach, который автоматически включается до того, как он возвращает управление обратно вызывающему потоку.Ваш пример может выглядеть так:
foreach(ref elem; parallel(array)) {
job1(elem);
}
foreach(ref elem; parallel(array)) {
job2(elem);
}
В этом случае job1
и job2
не должны запускать новую задачу, поскольку параллельный цикл foreach уже использует достаточно задач для полного использования всех ядер ЦП.