en ordre de code asynchrone IO

Tout en asynchrone IO (non-bloquant descripteurs avec select/poll/epoll/kqueue etc) n'est pas le plus documenté chose sur le web, il ya une poignée de bons exemples.

Cependant, tous ces exemples, après avoir déterminé les poignées qui sont retournées par l'appel, il suffit d'avoir un " do_some_io(fd) ' stub. Ils n'ont pas vraiment expliquer comment les approcher le réel asynchrone IO dans une telle méthode.

Blocage IO est très coquette et simple à lire le code. Non-bloquante, async IO est, d'autre part, de poils et de désordre.

Quelles approches sont là? Ce sont robustes et lisible?

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 que (ab)à l'aide de GCC est calculée gotos:

#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 d'une machine à état, de sorte que le travailleur fonctions peuvent déclencher l'interrompre/reprendre peu, ou peut-être une table-piloté par l'état de la machine?

Ses pas comment faire pour le faire fonctionner, la façon de le rendre facile à gérer que je suis à courir!

InformationsquelleAutor Will | 2009-05-19