Pula wątków to specjalny mechanizm zaimplementowany w CLR, mający na celu ponowne używanie tych samych wątków. W dzisiejszym wpisie chciałbym wyjaśnić co to jest optymalna liczba wątków i jaki ona ma wpływ na wydajność. Rozważmy następujący kod:
internal class Program { public static void Main() { for (int i = 0; i < 10; i++) { Stopwatch stopwatch = Stopwatch.StartNew(); ThreadPool.QueueUserWorkItem(Run, stopwatch); } Console.ReadLine(); } private static void Run(object state) { Stopwatch stopwatch = (Stopwatch) state; Console.WriteLine(stopwatch.ElapsedMilliseconds); Thread.Sleep(10000); } }
Na ekranie (procesor dwurdzeniowy) zobaczymy:
Dlaczego tworzenie kolejnych wątków (oprócz dwóch pierwszych) jest tak wolne? Zasada jest prosta – gdy liczba utworzonych wątków przekroczy optymalną wartość wtedy kolejne będą spowalniane tak, aby wyłącznie jeden został tworzony w ciągu 500 milisekund. Stąd możemy zaobserwować odstępy półsekundowe.Co jest zatem tym optymalnym progiem? Domyślnie jest to Max(MinThreads, CPU_CORES) czyli jest to albo liczba rdzeni (procesorów) albo minimalna liczba wątków, którą można samemu zdefiniować. Domyślnie (dla aplikacji desktop) minimalna liczba wątków to zero stąd została użyta w moim przypadku wartość 2 (liczba rdzeni).
Można oczywiście ustawić samemu minimalną liczbę wątków:
ThreadPool.SetMinThreads(10, 0);
Wtedy zobaczymy: