Si bien el IO asíncrono (descriptores no bloqueantes con select/poll/epoll/kqueue, etc.) no es la cosa más documentada en la web, hay algunos buenos ejemplos.código de orden para IO asíncrono
Sin embargo, todos estos ejemplos, habiendo determinado los identificadores devueltos por la llamada, solo tienen un resguardo 'do_some_io(fd)
'. En realidad, no explican cómo abordar mejor el IO asíncrono real en dicho método.
El bloqueo de IO es muy ordenado y sencillo de leer el código. Sin bloqueo, Async IO es, por otro lado, peludo y desordenado.
¿Qué enfoques hay? ¿Qué son robustos y legibles?
void do_some_io(int fd) {
switch(state) {
case STEP1:
... async calls
if(io_would_block)
return;
state = STEP2;
case STEP2:
... more async calls
if(io_would_block)
return;
state = STEP3;
case STEP3:
...
}
}
o tal vez (ab) uso de los goto de GCC calculadas:
#define concatentate(x,y) x##y
#define async_read_xx(var,bytes,line) \
concatentate(jmp,line): \
if(!do_async_read(bytes,&var)) { \
schedule(EPOLLIN); \
jmp_read = &&concatentate(jmp,line); \
return; \
}
// macros for making async code read like sync code
#define async_read(var,bytes) \
async_read_xx(var,bytes,__LINE__)
#define async_resume() \
if(jmp_read) { \
void* target = jmp_read; \
jmp_read = NULL; \
goto *target; \
}
void do_some_io() {
async_resume();
async_read(something,sizeof(something));
async_read(something_else,sizeof(something_else));
}
o quizás excepciones de C++ y una máquina de estados, por lo que las funciones de los trabajadores pueden desencadenar el bit de interrupción/reanudación, o tal vez una tabla impulsada ¿máquina estatal?
No es cómo hacer que funcione, es cómo hacerlo más fácil de mantener que estoy persiguiendo!
El libevent buffer eventos envoltorios, con altas y bajas incluso marcas de agua , son una forma conveniente de evitar el manejo IO arenoso; pero, ¿cómo se representa este estado en el código que lo llama y que debe ser reanudable? – Will
EDITADO: Agregué un ejemplo – Artyom
gracias Artyom, espero que la gente busque en Google epoll y ¡así lo encuentran! – Will