vložil Radek Červinka
24. května 2024 14:34
Jen taková krátká poznámka ze života.
Dělal jsem úkol, kde se spouštělo velké množství tasků, které nezávisejí na pořadí. Prostě jak přijde nový požadavek, tak se převezme a podle případu se vygeneruje x výstupů. Krásná úloha pro TTask a TThreadPool. Fungovalo to nádherně, jen si zákazník přál, aby si mohl regulovat kolik dostane program vláken.
TThreadPool má property MaxLimitWorkerThreadCount, která je v D11 a D12 inicializována na TThread.ProcessorCount * 2. Takže prima, při inicializaci jsem nastavil
TThreadPool.Current.SetMaxWorkerThreads(Cfg.MaxThreadCount);
a počet vláken klesl, ale přišlo mi, že v některých situacích je počet vláken trochu větší. Po zkoumání jsem přišel na to, že v D12 přibyla nová property TThreadPool.UnlimitedWorkerThreadsWhenBlocked.
Tato property je inicializována na True a cituji
Allows thread pool to increase number of working threads higher than MaxWorkerThreads
when processing of work requests is blocked. This is when job request queue is not empty,
pool has no idle or retired threads, and CPU usage is low. This may be a sign of deadlock.
Takže jsem tedy nastavil
TThreadPool.Current.UnlimitedWorkerThreadsWhenBlocked := False;
a případ uzavřen.