Решил вот потеснее познакомиться с многопоточной обработкой запросов от клиентов на сервере
До этого не имел дела с пулом потоков никогда.
Очень активно использую ATL, по этому мой взгляд естественно упал на CThreadPool.
Пробежавшись немного по форуму выяснил, что есть у него вроде проблема с shutdown, мол очередь запросов не обрывается а выполняется до конца. Сам не проверял еще, все только из отрывочных постов по форуму.
Использую студию VS9.0, может в atl более поздних версий эта проблема уже была решена?
Может еще есть какие-либо реализованные пулы, на которые стоит обратить свой взор? boost не предлагать )
Нужно обрабатывать запросы от пользователей, запросы равноприоритетные, средняя частота запросов думаю около 5 в секунду, запросы в большинстве случаев обрабатываются быстро. В пик может быть запросов 20-30 в секунду будет.
Функция, которую будет дергать пул потоков, содержит в себе полный цикл обработки соединения с клиентом — синхронное чтение команды с сокета, помещение команды в очередь команд, очередь обрабатывает другой поток, ожидание формирования ответа для своей команды, отправка ответа клиенту.
CthreadPool, как я понял, сделан на основе IOCP? На сколько он подходит моей задаче? Может какие нюансы не учел?
Здравствуйте, Hayabusa, Вы писали:
H>Если кто использует какой нибудь thread pool — киньтесь ссылкой, ну и пару слов о нем..
Что-то ответов в теме совсем нет. А мне бы тоже было интересно почитать вкратце о разных тредпулах.
Может кто кинет ссылочку на описание разных вариантов реализаций?
Оффтопик. От себя могу в двух словах сказать об изюминке ThreadPool'а в дотнете. Начиная с версии 4.0 в нём реализована work stealing. В каждом потоке имеется локальная очередь заданий, вернее стек LIFO. Благодаря этому реже происходит cache miss.
Здравствуйте, Аноним, Вы писали:
А>Пробежавшись немного по форуму выяснил, что есть у него вроде проблема с shutdown, мол очередь запросов не обрывается а выполняется до конца. Сам не проверял еще, все только из отрывочных постов по форуму. А>Использую студию VS9.0, может в atl более поздних версий эта проблема уже была решена?
Реализация в ATL использует IOCP.
Все задачи ставятся в очередь.
Вызов Shutdown добавляет в очередь задания "кончай работу" в количестве, равном количеству потоков.
Все задачи выполняются в порядке FIFO.
Т.е., все задачи, которые есть на момент вызова Shutdown, будут выполнены.
В реализации ATL никто не мешает добавить задачи в момент вызова Shutdown, т.е. можно успеть добавить новые задачи после atl-ных заданий "кончай работу".
Эти новые задачи выполнены не будут.
Здравствуйте, Hayabusa, Вы писали:
H>Немного опишу задачу.
H>Функция, которую будет дергать пул потоков, содержит в себе полный цикл обработки соединения с клиентом — синхронное чтение команды с сокета, помещение команды в очередь команд, очередь обрабатывает другой поток,
Какой другой — тоже из пула?
H>ожидание формирования ответа для своей команды,
поток пула будет ждать и ничего не делать?
H>отправка ответа клиенту.
H>CthreadPool, как я понял, сделан на основе IOCP?
Да
H>На сколько он подходит моей задаче? Может какие нюансы не учел?
Здравствуйте, rus blood, Вы писали:
RB>Реализация в ATL использует IOCP. RB>Все задачи ставятся в очередь. RB>Вызов Shutdown добавляет в очередь задания "кончай работу" в количестве, равном количеству потоков. RB>Все задачи выполняются в порядке FIFO. RB>Т.е., все задачи, которые есть на момент вызова Shutdown, будут выполнены.
Т.е. такой механизм получился из-за использования IOCP?
Я имею ввиду то, что нельзя прервать обработку очереди заданий..
И никак не обойти при использовании этого пула?
RB>В реализации ATL никто не мешает добавить задачи в момент вызова Shutdown, т.е. можно успеть добавить новые задачи после atl-ных заданий "кончай работу". RB>Эти новые задачи выполнены не будут.