Alors que les E/S asynchrones (descripteurs non bloquants avec select/poll/epoll/kqueue etc) ne sont pas les choses les plus documentées sur le web, il existe une poignée de bons exemples.code propre pour les E/S asynchrones
Toutefois, tous ces exemples, après avoir déterminé les poignées renvoyées par l'appel, ont simplement un stub 'do_some_io(fd)
'. Ils n'expliquent pas vraiment comment mieux approcher les E/S asynchrones réelles dans une telle méthode.
Blocage des entrées-sorties est très simple et facile à lire le code. Non bloquant, l'IO asynchrone est, d'autre part, poilu et salissant.
Quelles sont les approches? Quels sont robustes et lisibles?
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:
...
}
}
ou peut-être (ab) en utilisant des GOTO calculés de GCC:
#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));
}
Ou peut-être des exceptions C et une machine d'état, de sorte que les fonctions des travailleurs peut déclencher le bit abort/CV, ou peut-être un conduit de table machine d'état?
Ce n'est pas comment le faire fonctionner, c'est comment le rendre maintenable que je chasse!
Les enveloppes d'événements tamponnés libevent, avec filigranes haut et bas même , sont une manière commode d'éviter la manipulation d'IO graveleuse; mais comment représentez-vous cet état dans le code qui l'appelle qui doit être repris? – Will
EDITED: Ajout d'un exemple – Artyom
merci Artyom, j'espère que les gens googling epoll et tel trouver ceci! – Will