Wątki z puli–optymalna liczba wątków.

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:

image

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:

image

Leave a Reply

Your email address will not be published.