Пул потоков.
Не хочу лить воду. А в проектировании так всегда или почти всегда. Поэтому остановимся на конкретике.
Зачем он нужен?
Автоматизация управления потоками.
Разделение управления и обработчиков.
Повышение производительности.
Балансировка потоков.
Когда не следует использовать пул потоков?
Когда есть длинные задачи.
Приоритеты задач
Необходимо иметь стабильную идентификацию, сопоставленную с потоком, или назначить поток задаче.
Автоматизация. Пользователю пулом потоков не нужно заботиться о создание и уничтожении потоков.
Разделение управления и обработчиков. Пулом потоков за счёт инкапсуляции позволяет избежать досадных ошибок. Защищая данные передаваемые в поток и сами потоки от возможных случайных ссылок на уничтоженные объекты(потоки и данные).
Замечание ! Такой подход не означает, что вы можете забыть о безопасности данных. Просто он гарантирует целостность их на входе в задачу и на выходе из задачи. Но если вы будете их менять по ходу выполнения задачи, то вы сможете нарваться на неприятности.
Для коротких задач не требуется каждый раз создавать поток.
Балансировка потоков. Числом различных задач можно балансировать нагрузку. Ставя в очередь нужное количество задач мы можем получить нужный процентное соотношение.
Если хочется то можно
Когда есть длинные задачи. Вы можете разбить их на короткие и тогда вы сможет в любой момент прервать длинную задачу.
Приоритеты задач. Пул потоков не предусматривает очерёдность исполнения задач.
Но если их ввести в модификацию, то возникнут трудности с повышением производительности. Но в принципе есть решения допускающее такой подход.
Необходимо иметь стабильную идентификацию, сопоставленную с потоком, или назначить поток задаче. Редкий случай, когда надо закрепить за потоком нужные данные.
Замечание! Фрагментация памяти. Во избежание фрагментации память должна выделяться до того как пул потоков начнёт работать. Либо же вы должны использовать сборку мусора и дефрагментатор.
Как пул потоков планирует работы потоков?
Поток опрашивает очередь в течении NonSleepTime. Если не находит задач то засыпает.
Если пул- потоков обнаруживает что потоки не используются более TimeLive=CoiffecienLive* NonSleepTime то поток уничтожается.
Новые потоки создаются если замечено нехватка рабочих потоков. Потоки не забрали ни одну задачу за WorkTime.
Если задач нет, то потоки либо засыпают, либо уничтожаются. Если потоков меньше минимума то они спят если больше уничтожаются.
http://embarcadero.newsgroups.archived. ... 26520.htmlhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms683194(v=vs.85).aspxhttp://msdn.microsoft.com/ru-ru/library/0ka9477y(v=vs.110).aspxhttp://rsdn.ru/forum/delphi/1181461.allДобавлено спустя 50 минут 27 секунд:Единственная большая проблема с потоками это интеграция с приложением.
Дело в том что нужно правильно организовать работу.
1) Поток должен исполнять короткие задачи порядка 0,1-10 мс.
Это нужно что-бы нормально можно было его остановить, без заметных простоев.
2) Вопрос синхронизации. Нельзя блокировать основной поток, он должен обрабатывать сообщения для вывода и реагировать на кнопки. Но при этом он должен ждать завершения команд. Что явно носит событийный характер.