15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Класс управления потоками.

Автор: Sherwood Hu

  • Скачать исходник - 3 Kb
  • Скачать демонстрашку - 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. После того, как процесс завершится, то он будет автоматически удалён.