¿Cuál es el mejor servicio de notificación de eventos de E/S de Windows?
Por mejor quiero decir algo que ...
En Windows, las operaciones asincrónicas se realizan por operación de archivo, no por descriptor. Hay varias formas de esperar a que las operaciones de archivo se completen de forma asincrónica.
Por ejemplo, si desea saber cuándo hay datos disponibles en un socket de red, emita una solicitud de lectura asíncrona en el socket y cuando se complete, los datos estaban disponibles y se recuperaron.
En Win32, las operaciones asíncronas usan la estructura OVERLAPPED
para contener el estado de una operación pendiente IO).
WaitForMultipleObjects
para espere todos los eventos a la vez. Esto tiene la desventaja de que solo puede esperar los objetos MAXIMUM_WAIT_OBJECTS
a la vez (64). También puede esperar otros tipos de eventos al mismo tiempo (terminación del proceso/subproceso , mutexes, eventos, semáforos)ReadFileEx
y WriteFileEx
para poner en cola Llamadas de procedimiento asincrónicas (APC) al hilo de llamada y SleepEx
(o WaitFor{Single|Multiple}ObjectsEx
) con Alertable TRUE
para recibir un mensaje de notificación para cada operación cuando se complete. Este método es similar a un puerto de finalización IO, pero solo funciona para un subproceso.El kernel de Windows NT no distingue internamente entre las operaciones de socket, archivo de disco, tubería, etc. internamente: todas estas opciones funcionarán con todos los tipos de archivo.
libuv
libuv
ofrece E/S evented para Unix y Windows y tiene soporte para socket, archivos y tuberías. Es la capa de plataforma de Node.js.
Más detalles en: http://nikhilm.github.io/uvbook/introduction.html
Todavía no hay uno, que yo sepa. Un amigo y yo estamos trabajando en una implementación de código abierto de Windows epoll (enlace a continuación), pero nos encontramos con problemas para descubrir cómo hacer que funcione igual que la implementación de Linux.
Obstáculos actuales:
Intentaré volver y actualizar esta publicación a medida que avanzamos con el proyecto.
la función select () es POSIX y se puede usar en ventanas que incluyen "winsock.h" o "winsock2.h".