Возможно ли использовать IOCP (или другой API) в операциях в стиле реактора?
Вопрос
Существует ли какой-либо масштабируемый Win32 API (например, IOCP, а не select), который предоставляет вам стиль reactor операции с сокетами?AFAIK IOCP позволяет получать уведомления о выполненных операциях например, о чтении или записи данных (proactor), но я ищу стиль операций reactor:Мне нужно получать уведомления, когда сокет доступен для чтения или записи (reactor).
Что-то похожее на epoll, kqueue, /dev/poll
?
Есть ли такой API в Win32?Если да, то где я могу найти руководство по этому вопросу?
** Уточнение: ** Мне нужно select
например, api для сокетов, который является таким же масштабируемым, как IOCP, или я ищу способ использовать IOCP в операциях, подобных реактору.
Еще больше разъяснений: IOCP позволяет вам получать уведомления о завершении данной операции.Например:
WSARecv(buffer,...); // start reading
WSAWaitForMultipleEvents(...); // wait when read is done
Итак, я получаю уведомление после операция выполнена - прокторский стиль ведения операций.
Что мне нужно, так это что-то вроде этого:
WSARecv( NOTHING ); // start waiting for readability (not actual read)
WSAWaitForMultipleEvents(...); // wait until read would not block
// Now WSARecv would not block
WSARecv(buffer,...); // now actual non-blocking read
Как я могу это сделать?
Решение 3
Это невозможно.
Я проверил Boost.Исходники Asio, которые работают в стиле reactor и используют IOCP.Для всех операций в стиле реактора отдельный поток с select
используется вместо IOCP.
Другие советы
Вы хотите взглянуть на Выбор WSAAsyncSelect API.Он использует очередь сообщений Windows, чтобы сигнализировать о том, что дескриптор прочитан для чтения / записи / чего угодно, поэтому у него нет преимуществ параллелизма IOCP, но он позволяет вам реализовать стандартный шаблон reactor без ограничения количества дескрипторов (например WSAWaitForMultipleEvents
).
Я в замешательстве, разве это не шаблон Reactor, где поток блокирует ожидание от нескольких источников событий?Это был бы select (), который поддерживает Windows.Шаблон Proactor - это когда для каждого вызова выполняется один обратный вызов, который вы можете выполнить через ReadFileEx / WriteFileEx .
Вы пробовали передавать нулевое значение nNumberOfBytesToRead, например, в ReadFile(socket_fd, ..)?
Возможно, это поможет получить событие "read ready".