Хотя асинхронный IO (неблокирующие дескрипторы с select/poll/epoll/kqueue и т. Д.) Не является самой документированной вещью в Интернете, есть несколько хороших примеров.tidy code for asynchronous IO
Однако все эти примеры, определяя дескрипторы, возвращаемые вызовом, имеют только «do_some_io(fd)
». Они действительно не объясняют, как наилучшим образом подойти к фактическому асинхронному IO в таком методе.
Блокировка ввода-вывода очень аккуратная и простая в считывании кода. С другой стороны, неблокирующий, async IO, волосатый и грязный.
Какие подходы существуют? Что такое надежное и читаемое?
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:
...
}
}
или, возможно, (аб) с использованием вычисленных последовательно открывает ССЗ:
#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));
}
или, возможно, исключения C++ и государственную машину, поэтому функции работник может вызвать преждевременное прекращение/резюме немного, или, возможно, с приводом стола Государственный аппарат?
Его не так, как заставить его работать, как его поддерживать, чтобы я гонялся!
Libevent буферизации событий оберток, с высокими и низкими водяными знаками даже , являются удобным способом избежать сложной обработки ввода-вывода; но как вы представляете это состояние в коде, который вызывает его, который должен быть возобновлен? – Will
EDITED: добавлен пример – Artyom
спасибо Артем, я надеюсь, что люди googling epoll и такие найдут это! – Will