Пул потоков - это группа предварительно созданных, незанятых потоков, готовых к работе. Они предпочтительнее, чем создание новых потоков для каждой задачи, когда нужно выполнить большое количество коротких задач, а не небольшое количество длинных. Это избавляет от необходимости накладывать расходы на создание потока большое количество раз.
Реализация зависит от среды, но в упрощенном виде вам необходимо следующее:
- Способ создания потоков и удержания их в состоянии ожидания. Это можно сделать, заставив каждый поток ждать у барьера, пока пул не сработает. (Это также может быть сделано с мьютексами.)
- Контейнер для хранения созданных потоков, таких как очередь или любая другая структура, в которой есть способ добавить поток в пул и вытащить его.
- Стандартный интерфейс или абстрактный класс для потоков, используемых в работе. Это может быть абстрактный класс, вызываемый
Task
с помощью execute()
метода, который выполняет работу, а затем возвращает.
Когда пул потоков создается, он либо создает определенное количество потоков, чтобы сделать их доступными, либо создает новые по мере необходимости в зависимости от потребностей реализации.
Когда пул передается a Task
, он берет нить из контейнера (или ждет, пока он станет доступным, если контейнер пуст), передает его a Task
и встречает барьер. Это заставляет свободный поток возобновить выполнение, вызывая execute()
метод, который Task
ему был дан. По завершении выполнения поток возвращается обратно в пул для помещения в контейнер для повторного использования, а затем встречает свой барьер, переводя себя в спящий режим до повторения цикла.
Пул потоков - это набор управляемых потоков, обычно организованных в очередь, которые выполняют задачи в очереди задач.
Создание нового объекта потока каждый раз, когда вам нужно что-то выполнить асинхронно, стоит дорого. В пуле потоков вы просто добавляете задачи, которые вы хотите выполнять асинхронно, в очередь задач, а пул потоков заботится о назначении доступного потока, если таковой имеется, для соответствующей задачи. Как только задача завершена, доступный поток запрашивает другую задачу (при условии, что она осталась).
Пул потоков помогает вам избежать создания или уничтожения большего количества потоков, чем было бы на самом деле необходимо.
Я бы начал с создания класса с очередью потоков и очередью задач. Затем реализуйте метод, который добавляет задачу в очередь задач и переходит оттуда. Очевидно, вы также должны сделать возможным установить максимально допустимые потоки в пуле потоков.
источник
В многопоточном приложении пул потоков - это «пул доступных потоков», который может использоваться вашим приложением. Обычно, например .NET, все это управляется, поэтому вы просто назначаете задачи, и как только поток освобождается, он собирается его выполнять. Поэтому для реализации пула потоков я бы хотел создать концепцию, в которой задачи автоматически выполняются свободными потоками без явного создания потока для каждой задачи.
источник
Пример из реальной жизни;
У вас есть объект, там работают 12 человек. Есть 3 раздела этого объекта. Кухня, комнаты отдыха и охрана. Если вы не используете технику пула потоков, вот как это работает: все 12 человек будут стоять в комнате собраний, если новые клиенты приходят по объекту и просят о выполнении задач, тогда вы будете разделять людей по группам и отправлять их для выполнения своей работы. и вернитесь в конференц-зал. Но, прежде чем они приступят к своим обязанностям, есть подготовительная фаза. Они должны носить правильную форму, оборудовать определенные устройства и пройти к этому участку, закончить работу и вернуться. Таким образом, каждый раз, когда они заканчивают свою работу (нить заканчивается), им нужно возвращаться в комнату для собраний, раздевать форму, снимать оборудование и ждать следующей работы. Они относятся к созданию контекста потока, его распределению памяти и информации об отслеживании ОС.
Если вы используете пул потоков, то рано утром вы назначите 6 человек на кухню, 2 человека на уборную и 4 человека на охрану. Таким образом, они будут заниматься подготовкой только один раз в день. Даже если на кухне нет клиентов, эти 4 человека будут там, на холостом ходу, для любых предстоящих задач. Им не нужно возвращаться в конференц-зал, пока кухня не закроется (приложение заканчивается). Эти 4 человека находятся в пуле приложений Kitchen и готовы к быстрому обслуживанию. Но вы не можете обещать, что они работают весь день, потому что кухня может время от времени простаивать. Та же логика применима и к уборным, и к безопасности.
В первом сценарии вы не тратите ни одного потока на выполнение какой-либо задачи, НО потребуется много времени для подготовки каждого отдельного потока для каждой задачи. Во втором случае вы подготавливаете потоки заранее, поэтому вы не можете гарантировать, что будете использовать все потоки для всех задач, но ОС в основном оптимизирует его, поэтому вы можете смело полагаться на него.
источник