CThreadPool
От: Аноним  
Дата: 24.04.14 08:56
Оценка:
Всем привет,

Решил вот потеснее познакомиться с многопоточной обработкой запросов от клиентов на сервере
До этого не имел дела с пулом потоков никогда.
Очень активно использую ATL, по этому мой взгляд естественно упал на CThreadPool.

Пробежавшись немного по форуму выяснил, что есть у него вроде проблема с shutdown, мол очередь запросов не обрывается а выполняется до конца. Сам не проверял еще, все только из отрывочных постов по форуму.
Использую студию VS9.0, может в atl более поздних версий эта проблема уже была решена?
Может еще есть какие-либо реализованные пулы, на которые стоит обратить свой взор? boost не предлагать )
Re: CThreadPool
От: Hayabusa Россия  
Дата: 24.04.14 09:13
Оценка:
Почему то был не залогинен, в общем это мой пост..

Если кто использует какой нибудь thread pool — киньтесь ссылкой, ну и пару слов о нем..
Re: CThreadPool
От: Hayabusa Россия  
Дата: 24.04.14 10:01
Оценка:
Немного опишу задачу.

Нужно обрабатывать запросы от пользователей, запросы равноприоритетные, средняя частота запросов думаю около 5 в секунду, запросы в большинстве случаев обрабатываются быстро. В пик может быть запросов 20-30 в секунду будет.
Функция, которую будет дергать пул потоков, содержит в себе полный цикл обработки соединения с клиентом — синхронное чтение команды с сокета, помещение команды в очередь команд, очередь обрабатывает другой поток, ожидание формирования ответа для своей команды, отправка ответа клиенту.

CthreadPool, как я понял, сделан на основе IOCP? На сколько он подходит моей задаче? Может какие нюансы не учел?
Re: CThreadPool
От: Hayabusa Россия  
Дата: 24.04.14 14:25
Оценка:
Где можно пример посмотреть по CThreadPool, а то чет не могу найти, даже в msdn..
Re[2]: CThreadPool
От: koodeer  
Дата: 25.04.14 14:37
Оценка:
Здравствуйте, Hayabusa, Вы писали:

H>Если кто использует какой нибудь thread pool — киньтесь ссылкой, ну и пару слов о нем..


Что-то ответов в теме совсем нет. А мне бы тоже было интересно почитать вкратце о разных тредпулах.
Может кто кинет ссылочку на описание разных вариантов реализаций?

Оффтопик. От себя могу в двух словах сказать об изюминке ThreadPool'а в дотнете. Начиная с версии 4.0 в нём реализована work stealing. В каждом потоке имеется локальная очередь заданий, вернее стек LIFO. Благодаря этому реже происходит cache miss.
Re: CThreadPool
От: rus blood Россия  
Дата: 25.04.14 14:46
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Пробежавшись немного по форуму выяснил, что есть у него вроде проблема с shutdown, мол очередь запросов не обрывается а выполняется до конца. Сам не проверял еще, все только из отрывочных постов по форуму.

А>Использую студию VS9.0, может в atl более поздних версий эта проблема уже была решена?

Реализация в ATL использует IOCP.
Все задачи ставятся в очередь.
Вызов Shutdown добавляет в очередь задания "кончай работу" в количестве, равном количеству потоков.
Все задачи выполняются в порядке FIFO.
Т.е., все задачи, которые есть на момент вызова Shutdown, будут выполнены.

В реализации ATL никто не мешает добавить задачи в момент вызова Shutdown, т.е. можно успеть добавить новые задачи после atl-ных заданий "кончай работу".
Эти новые задачи выполнены не будут.
Имею скафандр — готов путешествовать!
Re[2]: CThreadPool
От: rus blood Россия  
Дата: 25.04.14 14:48
Оценка:
Здравствуйте, Hayabusa, Вы писали:

H>Немного опишу задачу.


H>Функция, которую будет дергать пул потоков, содержит в себе полный цикл обработки соединения с клиентом — синхронное чтение команды с сокета, помещение команды в очередь команд, очередь обрабатывает другой поток,


Какой другой — тоже из пула?

H>ожидание формирования ответа для своей команды,


поток пула будет ждать и ничего не делать?

H>отправка ответа клиенту.


H>CthreadPool, как я понял, сделан на основе IOCP?


Да

H>На сколько он подходит моей задаче? Может какие нюансы не учел?


Простой пул. Вполне походит.
Имею скафандр — готов путешествовать!
Re[3]: CThreadPool
От: Hayabusa Россия  
Дата: 25.04.14 15:45
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Какой другой — тоже из пула?


Нет, другой поток.

H>>ожидание формирования ответа для своей команды,


RB>поток пула будет ждать и ничего не делать?


Да, именно так..
Понимаю, что что-то неправильно в этой схеме, но пока так )
Re[2]: CThreadPool
От: Hayabusa Россия  
Дата: 25.04.14 15:48
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Реализация в ATL использует IOCP.

RB>Все задачи ставятся в очередь.
RB>Вызов Shutdown добавляет в очередь задания "кончай работу" в количестве, равном количеству потоков.
RB>Все задачи выполняются в порядке FIFO.
RB>Т.е., все задачи, которые есть на момент вызова Shutdown, будут выполнены.

Т.е. такой механизм получился из-за использования IOCP?
Я имею ввиду то, что нельзя прервать обработку очереди заданий..
И никак не обойти при использовании этого пула?

RB>В реализации ATL никто не мешает добавить задачи в момент вызова Shutdown, т.е. можно успеть добавить новые задачи после atl-ных заданий "кончай работу".

RB>Эти новые задачи выполнены не будут.

Про задачи после shutdown — ну эт и так ясно )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.