Есть ли в ThreadPool локальная очередь задач для рабочих потоков?

Рейтинг: 3Ответов: 1Опубликовано: 30.05.2023

Решил освежить свои знания о работе пула потоков. В своих конспектах нашёл следующую схему работы пула потоков

введите сюда описание изображения

То есть судя по этой схеме алгоритм пула потоков следующий: у нас набор заготовленных потоков, есть глобальная очередь задач. Новая задача помещается в очередь, извлекается рабочим потоком, обрабатывается, поток возвращается в пул.

Но в чём загвоздка, я стал читать Рихтера и обнаружил, что потоки из пула работают совсем по другому. К всему выше написанному добавляется локальная очередь задач для каждого потока. И получается, что работа происходит по другому: сначала рабочий поток проверяет свою локальную очередь и локальные очереди других потоков, если в них нет задач, то только тогда идёт в главную очередь и достаёт задачу из неё, обрабатывает её и уходит в режим ожидания.

Схема с интернета

введите сюда описание изображения

Cхема которую я взял с интернета похоже на мою.

Поясните, пожалуйста, как всё-таки пул потоков управляет своими потоками. Может Рихтер уже устарел, и всё давно не так))

UPD

В какой момент в локальной очереди потока будет добавлена задача? У Рихтера ничего не сказано про это не сказано

Ответы

▲ 0

Да, есть. В локальную очередь помещаются вложенные или дочерние задачи. То есть те, которые были созданы внутри основной задачи, которая обрабатывается потоком пула.

Советую прочитать эту статью, тут достаточно подробно подымается тема Пула потоков и Планировщика задач (Task Scheduler) и того, каким образом организована работа очередей (глобальной и локальной): https://csharpcooking.github.io/2022/02/27/Task-Scheduler.html

А так же вот эта: https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskscheduler?view=net-8.0#Queues

И еще одна статья: https://medium.com/net-under-the-hood/internal-mechanisms-of-tasks-in-net-ef461956d4a7

Цитата из статьи выше (medium.com):

"Дефолтный пул потоков .NET содержит одну глобальную очередь FIFO и локальные очереди (по одной для каждого потока пула) LIFO."