В настоящее время я работаю над серверным приложением, написанным в стиле проактора, используя select () + пул потоков с динамическим размером (есть простой механизм, основанный на отслеживании незанятых рабочих потоков).
Мне нужно изменить его, чтобы использовать IOCP вместо select () в окнах, и мне интересно, как лучше всего использовать потоки.
Для справки: сервер имеет долговременные соединения с отслеживанием состояния, и любой запрос может потребовать значительной обработки и блокировки. Фактически, большинство запросов связаны с кодом, написанным заказчиком, который может блокироваться по желанию.
Я читал, что ОС может определить, когда один поток IOCP блокируется, и разблокировать другой, но не похоже, что есть какая-либо поддержка для создания дополнительных потоков при большой нагрузке или если многие из потоков заблокированы.
Я читал один сайт, который предположил, что у вас есть небольшой пул потоков фиксированного размера, который использует IOCP только для операций ввода-вывода, который отправляет запросы, которые могут блокироваться, в другой пул потоков с динамическим размером. Это кажется неоптимальным из-за требуемой дополнительной синхронизации потоков (хотя вы также можете использовать IOCP для задач для второго пула потоков) и большего количества необходимых потоков (дополнительное переключение контекста).
Это лучший способ?