Что такое пул потоков?


62

Как реализовать пул потоков? Я читал в википедии слова «пул потоков», но до сих пор не могу понять, что нужно сделать, чтобы решить этот вопрос (возможно, потому, что я не совсем понял, что такое пул потоков в простых терминах).

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

Ответы:


96

Пул потоков - это группа предварительно созданных, незанятых потоков, готовых к работе. Они предпочтительнее, чем создание новых потоков для каждой задачи, когда нужно выполнить большое количество коротких задач, а не небольшое количество длинных. Это избавляет от необходимости накладывать расходы на создание потока большое количество раз.

Реализация зависит от среды, но в упрощенном виде вам необходимо следующее:

  • Способ создания потоков и удержания их в состоянии ожидания. Это можно сделать, заставив каждый поток ждать у барьера, пока пул не сработает. (Это также может быть сделано с мьютексами.)
  • Контейнер для хранения созданных потоков, таких как очередь или любая другая структура, в которой есть способ добавить поток в пул и вытащить его.
  • Стандартный интерфейс или абстрактный класс для потоков, используемых в работе. Это может быть абстрактный класс, вызываемый Taskс помощью execute()метода, который выполняет работу, а затем возвращает.

Когда пул потоков создается, он либо создает определенное количество потоков, чтобы сделать их доступными, либо создает новые по мере необходимости в зависимости от потребностей реализации.

Когда пул передается a Task, он берет нить из контейнера (или ждет, пока он станет доступным, если контейнер пуст), передает его a Taskи встречает барьер. Это заставляет свободный поток возобновить выполнение, вызывая execute()метод, который Taskему был дан. По завершении выполнения поток возвращается обратно в пул для помещения в контейнер для повторного использования, а затем встречает свой барьер, переводя себя в спящий режим до повторения цикла.


19
Пул потоков - это группа предварительно созданных, незанятых потоков, готовых к работе. [...] Это избавляет от необходимости накладывать расходы на создание потока большое количество раз. - это должно быть сплющено Google всякий раз, когда кто-то ищет «пул потоков»
Рафаэль Эйнг

Есть ли пул потоков создания включает в себя барьер внутри? Можете ли вы поделиться ссылкой на эти строки?
сверхобмена

@overexchange Нет, это не так. Моя ссылка на этот вопрос была в качестве примера лучшего способа переписать ваш барьерный вопрос . (Если вы это сделаете, я напишу ответ.)
Blrfl

один из лучших коротких ответов.
Blood-HaZaRd

10

Пул потоков - это набор управляемых потоков, обычно организованных в очередь, которые выполняют задачи в очереди задач.

Создание нового объекта потока каждый раз, когда вам нужно что-то выполнить асинхронно, стоит дорого. В пуле потоков вы просто добавляете задачи, которые вы хотите выполнять асинхронно, в очередь задач, а пул потоков заботится о назначении доступного потока, если таковой имеется, для соответствующей задачи. Как только задача завершена, доступный поток запрашивает другую задачу (при условии, что она осталась).

Пул потоков помогает вам избежать создания или уничтожения большего количества потоков, чем было бы на самом деле необходимо.

Я бы начал с создания класса с очередью потоков и очередью задач. Затем реализуйте метод, который добавляет задачу в очередь задач и переходит оттуда. Очевидно, вы также должны сделать возможным установить максимально допустимые потоки в пуле потоков.


1

В многопоточном приложении пул потоков - это «пул доступных потоков», который может использоваться вашим приложением. Обычно, например .NET, все это управляется, поэтому вы просто назначаете задачи, и как только поток освобождается, он собирается его выполнять. Поэтому для реализации пула потоков я бы хотел создать концепцию, в которой задачи автоматически выполняются свободными потоками без явного создания потока для каждой задачи.


1

Пример из реальной жизни;

  1. Объект: Операционная система
  2. Разделы: Приложения
  3. Люди: Темы

У вас есть объект, там работают 12 человек. Есть 3 раздела этого объекта. Кухня, комнаты отдыха и охрана. Если вы не используете технику пула потоков, вот как это работает: все 12 человек будут стоять в комнате собраний, если новые клиенты приходят по объекту и просят о выполнении задач, тогда вы будете разделять людей по группам и отправлять их для выполнения своей работы. и вернитесь в конференц-зал. Но, прежде чем они приступят к своим обязанностям, есть подготовительная фаза. Они должны носить правильную форму, оборудовать определенные устройства и пройти к этому участку, закончить работу и вернуться. Таким образом, каждый раз, когда они заканчивают свою работу (нить заканчивается), им нужно возвращаться в комнату для собраний, раздевать форму, снимать оборудование и ждать следующей работы. Они относятся к созданию контекста потока, его распределению памяти и информации об отслеживании ОС.

Если вы используете пул потоков, то рано утром вы назначите 6 человек на кухню, 2 человека на уборную и 4 человека на охрану. Таким образом, они будут заниматься подготовкой только один раз в день. Даже если на кухне нет клиентов, эти 4 человека будут там, на холостом ходу, для любых предстоящих задач. Им не нужно возвращаться в конференц-зал, пока кухня не закроется (приложение заканчивается). Эти 4 человека находятся в пуле приложений Kitchen и готовы к быстрому обслуживанию. Но вы не можете обещать, что они работают весь день, потому что кухня может время от времени простаивать. Та же логика применима и к уборным, и к безопасности.

В первом сценарии вы не тратите ни одного потока на выполнение какой-либо задачи, НО потребуется много времени для подготовки каждого отдельного потока для каждой задачи. Во втором случае вы подготавливаете потоки заранее, поэтому вы не можете гарантировать, что будете использовать все потоки для всех задач, но ОС в основном оптимизирует его, поэтому вы можете смело полагаться на него.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.