É possível usar o IOCP (ou outras API) em Reator de operações no estilo?
Pergunta
Existe alguma escalável de API do Win32 (como IOCP não gosta de escolha) que dá a você um reator de estilo operações em soquetes?AFAIK IOCP permite que você receba uma notificação sobre operações concluídas como dados de leitura ou escrita (proactor), mas eu estou olhando para o reator de estilo de operações:Eu precisa receber uma notificação quando o socket é legível ou de escrita (reator).
Algo semelhante para epoll, kqueue, /dev/poll
?
É lá essas API do Win32?Se sim, onde posso encontrar um manual sobre ele?
** Esclarecimento:** eu preciso select
como api para soquetes que é tão escalável como o IOCP, ou eu estou procurando uma forma de usar o IOCP em reator de operações semelhantes.
Mais esclarecimentos: IOCP permite que você receba uma notificação sobre a realização de determinada operação.Por exemplo:
WSARecv(buffer,...); // start reading
WSAWaitForMultipleEvents(...); // wait when read is done
Assim que eu receber a noticação depois de a operação é feita -- proctor estilo das operações.
O que eu preciso é de algo como isso:
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
Como posso fazer isso?
Solução 3
Não é possível.
Eu verifiquei o Impulso.Asio fontes que têm reator de operações de estilo e uso IOCP.Para todos os reator de operações de estilo thread separada com select
é usado em vez de IOCP.
Outras dicas
Você quer olhar para o WSAAsyncSelect API.Ele usa uma fila de mensagem do Windows para sinalizar que um identificador é de leitura para leitura/gravação/seja o que for, então ele não tem a simultaneidade benefícios de IOCP, mas ele permite que você para implementar um padrão de reator padrão sem ter um limite para o número de identificadores (como WSAWaitForMultipleEvents
).
Estou confuso, não Reator padrão, onde a thread bloqueia, esperando em várias fontes de evento?Que seria select(), que o windows oferece suporte.O Proactor padrão é onde existe um único retorno de chamada por chamada, que você pode fazer através de ReadFileEx/WriteFileEx.
Você já tentou passar de zero nNumberOfBytesToRead, por exemplo ReadFile(socket_fd, ..)?
Talvez isso vai ajudar a obter a "leitura" pronto para o evento.