Как ThreadPool реализован в .NET 4.0? - PullRequest
2 голосов
/ 13 февраля 2012

Недавно я пытался понять, как решение класса ThreadPool работает в .NET 4.0. Я пытался прочитать отраженный код, но он кажется мне слишком обширным.

Может ли кто-нибудь объяснить простыми словами, как работает этот класс, т.е.

  1. Как он хранит каждый приходящий метод
  2. Является ли это потокобезопасным, предположительно, несколько потоков пытаются поставить в очередь свои методы в пуле потоков?
  3. Когда он достигает предела доступных потоков, как он возвращается для выполнения оставшегося пакета, ожидающего в очереди, когда один из потоков становится свободным? Есть ли какой-нибудь механизм обратного вызова для этого?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

Конечно, в отсутствие реальной реализации (или в отсутствие Эрика Липперта :)) я говорю только о здравом смысле:

  1. Пул потоков содержит внутреннюю (круговую?) Очередь, в которой хранятся задачи (следовательно, QueueUserWorkItem).
  2. Помещение задач в очередь является поточно-ориентированным (это точно, так как я несколько раз использовал себя в этом сценарии).
  3. Я думаю, что каждый поток зацикливается бесконечно и продолжает автоматически выполнять задачи из очереди (конечно, в поточно-ориентированном режиме), когда это делается с текущей задачей. Если очередь пуста, она просто заблокируется.
1 голос
/ 13 февраля 2012
  1. В очереди делегатов

  2. TBH, я точно не знаю, но если это не так, это опасно, почти бесполезно и, вероятно, худшеекод, когда-либо испускаемый M $ (даже включая Windows ME).Просто предположим, что он безопасен для потоков.

  3. Рабочие потоки представляют собой циклы while, ожидающие в очереди рабочих запросов для делегата, вызывающие один, когда он становится доступным, и затем возвращающиеся обратно, когдаделегат возвращается, чтобы снова ждать в очереди другого делегата.Нет необходимости в обратном вызове.

0 голосов
/ 13 февраля 2012
  1. Я не знаю точно, но, на мой взгляд, он хранит его в наборе задач
  2. MSDN говорит да

  3. GetMaxThreads () возвращает количество выполненных раз потоков, если вы достигнете этой границы, все остальные будут поставлены в очередь.Как я понимаю, вам нужен механизм, чтобы узнать, когда выполняется поток.Существует RegisterWaitForSingleObject (WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

...