2013-09-22 14 views
13

Chcę wiedzieć, ile wątków będzie używanych po uruchomieniu pętli Parallel.For/ForEach.Ile wątków Parallel.For (Foreach) utworzy? Domyślny MaxDegreeOfParallelism?

Znalazłem, że można go zmienić za pomocą opcji MaxDegreeOfParallelism.

MaxDegreeOfParallelism pomocy w MSDN mówi (link):

Domyślnie Za i ForEach wykorzysta jednak wiele gwintów bazowego harmonogram przewiduje więc zmieniając MaxDegreeOfParallelism z ustawienie domyślne tylko limity, ile jednoczesnych zadań będzie być użytym.

Ale nie wiem, ile wątków podanych harmonogramu zapewnia.

Jak mogę się tego dowiedzieć?

Mogłem przetestować go z pętlą z 9999999 uruchomień, jednak ten test pokaże mi liczbę, ale nie reguła, która określa tę liczbę.

Edycja/dodane później:

google dla "sheduler max współbieżności" i znalazłem (w MSDN - link), że TashSheduler klasa ma MaximumConcurrencyLevel nieruchomości, oraz:

Zwraca liczbę całkowitą reprezentujący maksymalny poziom współbieżności. Domyślny program planujący zwraca wartość Int32.MaxValue.

Że klasa TaskSheduler jest używana jako "podstawowy harmonogram" dla tych równoległych pętli?

+0

Co ciekawe, zwraca stałą '2147483647' .. nie' int32.MaxValue'. –

Odpowiedz

13

Według MSDN:

Domyślny planista dla Parallel Library zadań i PLINQ używa .NET Framework ThreadPool do kolejki i wykonać pracę. W .NET Framework 4, ThreadPool wykorzystuje informacje dostarczane przez typ System.Threading.Tasks.Task, aby skutecznie wspierać drobnoziarnisty równoległość (krótkotrwałe jednostki pracy), które często reprezentują równoległe zadania i zapytania.

Patrząc na documentation z ThreadPool, to mówi:

Jest jeden basen wątek na proces. Począwszy od platformy .NET Framework 4, domyślny rozmiar puli wątków dla procesu zależy od kilku czynników, takich jak rozmiar wirtualnej przestrzeni adresowej. Proces może wywołać metodę GetMaxThreads w celu ustalenia liczby wątków. Liczba wątków w puli wątków może zostać zmieniona przy użyciu metody SetMaxThreads.