のためのきちんとしたコードは、ウェブ上で最も文書化されものではありません、良い例の一握りがあります。非同期IO(選択/世論調査/ファイルディスクリプタ/ kqueueのなどと非ブロック記述子)しながら、非同期IO
はしかし、すべてのこれらの例は、呼び出しによって返されたハンドルを決定した、単に「do_some_io(fd)
」スタブを持っています。このような方法で実際の非同期IOに最適な方法を実際に説明するものではありません。 IOをブロック
は、コードを読むことは非常に整頓して簡単です。非ブロッキング、非同期IOは、一方で、毛深く、乱雑です。
どのようなアプローチがありますか?堅牢で読みやすいものは何ですか? GCCの計算GOTOSを用い
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):
#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
Artyomに感謝します。 – Will