【发布时间】:2010-10-27 08:35:03
【问题描述】:
虽然异步 IO(带有 select/poll/epoll/kqueue 等的非阻塞描述符)不是网络上记录最多的东西,但有一些很好的例子。
但是,所有这些示例在确定了调用返回的句柄后,都只有一个“do_some_io(fd)”存根。他们并没有真正解释如何以这种方法最好地处理实际的异步 IO。
Blocking IO 非常简洁易读。另一方面,非阻塞的异步 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:
...
}
}
或者也许(ab)使用 GCC 的计算 goto:
#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++ 异常和状态机,因此工作函数可以触发中止/恢复位,或者可能是表驱动的状态机?
我追求的不是如何让它工作,而是如何让它变得可维护!
【问题讨论】:
标签: c++ c asynchronous io