2009-07-27 3 views

ответ

9

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

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

2

Добавляя к ответу анонса, я хотел бы упомянуть, что существуют фиксированные пулы потоков, в которых есть фиксированные числа потоков; Кэшированные пулы потоков, которые могут динамически расти, а затем сокращаться, когда нет работы; Динамические пулы потоков также могут быть связаны максимальным количеством потоков и/или максимальной продолжительностью рабочей очереди. Я не думаю, что на самом деле существует определенная терминология для такого рода вещей, и редко встречаются нефиксированные TP, написанные на C, но по крайней мере один должен знать, что фиксированная TP не является единственным видом там.

3

Чтобы уточнить что-то в предыдущих ответах:

Причина, по которой инстанцировании все больше и больше нитей приводит к снижению эффективности является контекст времени переключения. OS периодически переключает один поток на другой на процессоре. Это связано с сохранением состояния одного потока и загрузкой состояния другого потока из памяти, поэтому для каждого контекстного переключателя требуется не пренебрежимо малое время, N мс.

Например, если у вас есть 10 потоков, переключение контекста takex 10 * N ms. Если у вас 1000 потоков, это 1000 * N мс. По мере увеличения количества параллельных потоков, в конечном итоге переключение контекста начинает подавлять любую эффективность, получаемую при многопоточности. Ваше приложение имеет сладкое пятно с точки зрения наилучшего количества потоков. Как только вы определите это сладкое число путем экспериментов, вы можете установить максимальный размер пула потоков в это число потоков, тем самым получая максимальную эффективность от многопоточности.

+0

Маловероятно, что для переключения контекста потребуется всего до 1 мс, как правило, это больше по линиям нас. Все остальное очень приятно. – CrazyCasta

+0

, который сказал, что N является целым числом и кто сказал, что это> = 1? – Blah0x7B9

+0

Использование единиц мс предполагает, что время будет порядка мс. Я считаю, что большинство людей, читающих ваш ответ, не подумают, что время переключения контекста было около 1 нас. – CrazyCasta

Смежные вопросы