Скачать демонстрашку - 24
KbВведение
В большинстве случаев, чтобы повысить
производительность системы приходится
создавать множество потоков. По сути все потоки
обладают одинаковой логикой, но нам нужно
управлять всей этой массой потоков. Принцып
управления сводится к тому, что если система
загружена, то мы создаём потоки и наоборос при
спаде нагрузки удаляем лишние потоки.
Совместимость: VC 4-6, NT4, W2K, MFC
Этот класс позволяет динамически создавать
рабочие потоки и распределять между ними
нагрузку. Вам достаточно наследовать от этого
класса собственный класс и уже не нужно будет
беспокоится о управлении потоками и
синхронизации между ними. Однако Вам необходимо
сделать Ваш класс безопасным, так как в любой
момент Ваши объекты могут взаимодействовать с
другими потоками.
С другой стороны я хочу показать использование
порта IOCompletion. Он Довольно прост в использование и
без особого труда позволяет передавать данные
между потоками.
Использование
Для использования класса пула потоков,
необходимо унаследовать собственный рабочий
класс от IWorker
и класс загруженности от IJobDesc
.
Логические схемы обработки информации должны
содержаться в методе IWorker::ProcessJob(IJobDesc* pJob)
.
После того как всё будет сделано, можно объявить
потоковый пул:
CThreadPool pool;
pool.Start(6, 10);
//сдесь выполняется некоторая работа
pool.Stop();
Функция Start
имеет два параметра. Первый
параметр - это минимальное количество рабочих
потоков, которые можно породить. Второй параметр
показывает максимальное количество рабочих
потоков в пуле. Если потоковый пул будет сильно
загружен, то автоматически начнут создаваться
новые потоки. И наоборот, если пул будет
простаивать, то лишние потоки будут "убиты".
Поэксперементируйте с этими двумя параметрами,
чтобы добится наилучшей производительности.
Чтобы дать команду пулу выполнять некоторую
работу, достаточно вызвать следующую функцию:
pool.ProcessJob(pJob, pWorker);
Заметка
Если процесс занимает много времени, то вызов
функции Stop()
не остановит мгновенно
вычисления. Функция Stop()
будет ожидать
максимум 2 минуты, а затем завершится. Эта функция
имеет один параметр. Если его установить в true, то
функция завершит рабочий поток в любом случае.
Ежели установить параметр в false, то данный
рабочий поток не завершится мгновенно и будет
жить ещё какое-то время. В этой ситуации Вам
прийдётся соблюдать осторожность, так как объект
рабочего потока может уже не существовать после
вызова функции Stop()
и Вы получите ошибку
доступа если попытаетесь обратиться к нему.
Объект работы должен быть сгенерирован в "куче"
используя оператор new
. После того, как
процесс завершится, то он будет автоматически
удалён.