Буду ждать до тех пор пока все задачи не будут выполнены - PullRequest
4 голосов
/ 01 декабря 2011

Это связано с моим предыдущим вопросом: D одновременная запись в буфер

Скажем, у вас есть кусок кода, который состоит из 2 последовательных блоков кода A и B, где B зависит от A. Это очень часто встречается в программировании. И A, и B состоят из цикла, в котором каждая итерация может выполняться параллельно:

double[] array = [ ... ]; // has N elements

// A
for (int i = 0; i < N; i++)
{
    job1(array[i]); // new task
}

// wait for all job1's to be done

// B
for (int i = 0; i < N; i++)
{
    job2(array[i]); // new task
}

B может быть выполнено только после завершения A. Как подождать, пока все задачи A завершены, прежде чем выполнять B?

1 Ответ

6 голосов
/ 01 декабря 2011

Я полагаю, вы используете 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 уже использует достаточно задач для полного использования всех ядер ЦП.

...