boost 1.57.0 前提で話を進めよう
Asioを使うことになった理由
- 速度が要求されるサーバの案件
- マルチスレッド対応でAsioを使おう
- シングルスレッドでI/Oを非同期で処理する
- ラムダがネストしまくるので、コールバックまみれになる
- コールバック地獄になりがち
- 読みづらい
可読性を上げる
- コールバック
- コルーチン
future/promise
今回はコルーチンを使おう。→シングルスレッドをマルチスレッドのように扱う
- 軽量スレッドのこと。
- 擬似並列化を行える
- 同期問題が起こりにくい
スタックレスコルーチン
- (簡単そうだった)
- asio::coroutineを継承
- couroutine関数はoperator()に
- continue部分はreenter()で囲む
- yield fork
header
- operator
reenter
reenterの中にコルーチンコードを書かないといけない
コルーチンを書くと、多少可読性が上がったのではなかろうか。
スタックレスコルーチンのメリット デメリット
- 非情に手軽
- かなりかるい
読みやすい
ローカル変数の扱いが制限
- ローカル変数が使えないのはきつい
スタックフルコルーチン
- 依存ライブラリあり
- コルーチンを行いたい関数を指定して、yield_contextを取得する
- spawnによりyield_context作成
- 非同期関数にyield contextを渡すことで、コルーチンに出来る
かなり可読性が上がったのでは?
Boost.MSM
- Transition Tableに上限
- plmplイディオムを使う
- 結構便利
shared_ptrキャプチャ
総括
- マルチスレッド型は大量クライアントをさばけない
- コールバック地獄になるので、コルーチンを使って非同期I/Oを使うべき
- ジェネリックラムダが来たらもっと快適になるのでは?
おまけ
お前らカーネル連中、いい加減に共通の非同期APIぐらい規格しろよといいたくなる。#kbkz_tech
— Ryou Ezoe (@EzoeRyou) 2015, 5月 17