Вкладка 1 повторяет логику ThreadPoolWorkQueue.Dequeue на двух потоках; вкладка 2 — числа из опытов главы 13 (Ubuntu 26.04, 2 ядра, .NET 10.0.12).
Поток A (владелец W)
локальная очередь A
Глобальная очередь (FIFO)
Поток B
локальная очередь B
Порядок выполнения
Потоков в пуле: 32 задачи по 1 с, MinThreads = 4
Thread.Sleep пулу ничего не сообщает: потоки добавляет только обнаружение голодания (раз в ~500 мс +1, и только если никто давно не брал из очереди). Task.Wait на потоке пула вызывает NotifyThreadBlocked (кооперативная блокировка): пул быстро растёт до числа заблокированных. Выключили её (CooperativeBlocking=false) — тот же Wait растёт по одному потоку в секунду и 32 задачи занимают 25,5 с вместо 5,3 с.