Страницы

Поиск по вопросам

среда, 6 марта 2019 г.

Parallel.For,Parallel.ForEach.Принцип работы

public static ParallelLoopResult For(int fromInclusive, int toExclusive, Func localInit, Func body, Action localFinally);
У меня остались несколько небольших вопросов,относительно вышеуказанной перегрузки,а именно:
Task создаётся для каждой итерации цикла for? Назначение в body первого int входного параметра.


Ответ

1) Вопрос предполагает наличие конкретного, документированного механизма реализации многопоточности в этой функции. Как именно достигается распараллеливание — внутренняя деталь имплементации.
В текущей имплементации создаётся корневой Task специального типа (ParallelForReplicatingTask), который умеет создавать свои легковесные копии. Но эти классы внутренние, и недоступны программисту. И разумеется в следующей версии имплементация имеет право поменяться без предупреждения.
2) Из документации
The body delegate is invoked once for each value in the iteration range (fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (Int32), a ParallelLoopState instance that may be used to break out of the loop prematurely, and some local state that may be shared amongst iterations that execute on the same thread.
То есть, первый параметр — общее количество итераций. Его можно использовать, например, для того, чтобы понять, какая часть общей работы выполнена.

Важное обновление: как правильно заметил @Grundy, смысл первого параметра в body — номер текущей итерации, а не количество итераций. Судя по всему, в документации ошибка. Заметьте, что номера вполне могут доставляться не подряд. Например, такой цикл:
Parallel.For( 0, 20, () => "Thread #" + Thread.CurrentThread.ManagedThreadId, (iter, loopState, localState) => { var res = localState + " " + iter; Console.WriteLine(res); return localState; }, s => { });
у меня выдал:
Thread #10 0 Thread #10 1 Thread #10 3 Thread #10 4 Thread #10 5 Thread #10 6 Thread #10 7 Thread #10 8 Thread #10 9 Thread #10 10 Thread #10 11 Thread #10 12 Thread #10 13 Thread #6 2 Thread #6 16 Thread #6 17 Thread #6 18 Thread #6 19 Thread #10 15 Thread #11 14

Комментариев нет:

Отправить комментарий