Объединение потоков в пул

Есть много прикладных программ, создающих потоки, которые тратят много времени на бездействующее состояние в ожидании события, которое произойдет. Другие потоки могут входить в бездействующее состояние только для того, чтобы периодически пробуждаться для опроса об изменении или модификации информации о состоянии. Объединение потоков в пул (thread pooling) дает возможность использовать потоки более эффективно, обеспечивая ваше приложение совокупностью рабочих потоков, которые управляются системой. По крайней мере, один поток контролирует состояние всех операций "занять", организуя очередь потоков в пуле. Когда операция "занять" завершается, рабочий поток из пула потоков исполняет соответствующую функцию повторного вызова.

Вы можете к тому же организовывать очередь рабочих элементов, которые не привязаны к операции "занять" пула потоков. Чтобы выяснить, какой рабочий элемент обрабатывается потоком в пуле потоков, вызовите функцию QueueUserWorkItem. Эта функция берет параметр для функции, которая должна быть вызвана потоком, выбранным из пула потоков. Нет никакого способа, чтобы отменить рабочий элемент после того, как он был поставлен в очередь.

Таймеры, очереди таймеров и зарегистрированные операции "занять" также используют пул потоков. Их функции повторного вызова организованы в очередь для пула потоков. Вы можете также использовать и функцию BindIoCompletionCallback, чтобы поместить в очередь асинхронные операции ввода-вывода. По завершению ввода - вывода данных (I/O), обратный вызов исполняет код потока из пула потоков.

Первоначально пул потоков создается, когда Вы вызываете функцию QueueUserWorkItem или BindIoCompletionCallback, или когда таймер очереди таймеров или зарегистрированная операция "занять" организуют очередь функций повторного вызова. Число потоков, которые могут быть созданы в пуле потоков, ограничивается только доступной памятью. Каждый поток использует, заданный по умолчанию размер стека и запускается с заданным по умолчанию приоритетом.

Есть два типа рабочих потоков в пуле потоков: производящий ввод - вывод данных (I/O) и не производящий ввод - вывод данных (I/O). Рабочий поток, производящий ввод - вывод данных (I/O) (I/O worker thread) - поток, который находится в настороженном состоянии ожидания. Рабочие элементы ставятся в очередь рабочим потоком, производящим ввод - вывод данных (I/O) как асинхронные вызовы процедуры (APC). Вам следует поставить в очередь рабочий элемент рабочего потока, производящего ввод - вывод данных (I/O), если он должен быть исполнен в потоке, который ждет в настороженном состоянии.

Рабочий поток, не производящий ввод-вывод данных (non-I/O worker thread) ждет порты, которые завершили ввод-вывод. Использование рабочих потоков, не производящих ввод-вывод данных более рационально, чем использование рабочих потоков ввода - вывода (I/O). По этой причине, вам следует использовать рабочие потоки, не производящие ввод-вывод данных (I/O) всякий раз, когда это возможно. И производящие ввод - вывод и не производящие ввод-вывод данных (I/O) рабочие потоки не заканчивают работу, если там ожидают обработки асинхронные запросы ввода - вывода (I/O). Оба типа потоков могут быть использованы рабочими элементами, которые инициализируют асинхронные запросы окончания ввода-вывода. Однако избегайте посылать асинхронные запросы завершения ввода-вывода в рабочие потоки, не производящие ввод-вывод данных (I/O), даже если они могут забрать длительное время для завершения.

Чтобы использовать объединение потоков в пул, рабочие элементы и все функции, которые они вызывают, должны быть безопасными для пула потоков. Функция безопасности не предполагает, что поток, исполняющий все это - выделенный или постоянный поток. В большинстве случаев, вам следует избегать использовать локальную память потока (TLS) и организацию очереди асинхронных обращений, которые требуют постоянного потока, типа функции RegNotifyChangeKeyValue. Однако такие функции могут организовать очередь постоянных рабочих потоков, используя функцию QueueUserWorkItem с параметром WT_EXECUTEINPERSISTENTTHREAD.

Обратите внимание! на то, что объединение потоков в пул не совместимо с моделью однопоточных апартаментов (STA).

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz