Я пытаюсь придумать дизайн для пула потоков с большим количеством требований к дизайну для моей работы. Это реальная проблема для работающего программного обеспечения, и это сложная задача. У меня есть работающая реализация, но я бы хотел высказать это в SO и посмотреть, какие интересные идеи могут придумать люди, чтобы я мог сравнить ее с моей реализацией и посмотреть, как она складывается. Я старался максимально точно соответствовать требованиям.
Пул потоков должен выполнить ряд задач. Задачи могут быть кратковременными (<1сек) или длительными (часы или дни). Каждое задание имеет связанный приоритет (от 1 = очень низкий до 5 = очень высокий). Задачи могут поступать в любое время, пока выполняются другие задачи, поэтому по мере их поступления пул потоков должен подобрать их и запланировать их, когда потоки станут доступными. </p>
Приоритет задачи полностью не зависит от длины задачи. На самом деле невозможно сказать, сколько времени может занять задание, не просто запустив его.
Некоторые задачи связаны с процессором, а некоторые сильно связаны с вводом-выводом. Невозможно заранее определить, какой будет данная задача (хотя я думаю, что ее можно было бы обнаружить во время выполнения задач).
Основная цель пула потоков - максимизировать пропускную способность. Пул потоков должен эффективно использовать ресурсы компьютера. В идеале для задач, связанных с ЦП, количество активных потоков должно быть равно количеству ЦП. Для задач, связанных с вводом-выводом, должно быть выделено больше потоков, чем процессоров, чтобы блокировка не оказала чрезмерного влияния на пропускную способность. Важно свести к минимуму использование замков и использование безопасных / быстрых контейнеров.
Как правило, вы должны запускать задачи с более высоким приоритетом с более высоким приоритетом процессора (ref: SetThreadPriority). Задачи с более низким приоритетом не должны блокировать выполнение задач с более высоким приоритетом, поэтому, если задача с более высоким приоритетом появляется во время выполнения всех задач с низким приоритетом, запускается задача с более высоким приоритетом.
С задачами связан параметр «Максимальное количество запущенных задач». Каждому типу задач разрешено запускать не более этого количества одновременных экземпляров задачи одновременно. Например, в очереди могут быть следующие задачи:
- A - 1000 экземпляров - низкий приоритет - максимальное количество задач 1
- B - 1000 экземпляров - низкий приоритет - максимум задач 1
- C - 1000 экземпляров - низкий приоритет - максимум задач 1
Работающая реализация может одновременно работать (максимум) 1 A, 1 B и 1 C.
Он должен работать в Windows XP, Server 2003, Vista и Server 2008 (последние пакеты обновлений).
Для справки, мы могли бы использовать следующий интерфейс:
namespace ThreadPool
{
class Task
{
public:
Task();
void run();
};
class ThreadPool
{
public:
ThreadPool();
~ThreadPool();
void run(Task *inst);
void stop();
};
}