by shigemk2

当面は技術的なことしか書かない

Boost.Asioで可読性を求めるのは間違っているだろうか #kbkz_tech

kbkz.connpass.com

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を渡すことで、コルーチンに出来る

f:id:shigemk2:20150517144513p:plain

f:id:shigemk2:20150517144617p:plain

かなり可読性が上がったのでは?

Boost.MSM

f:id:shigemk2:20150517144843p:plain

  • Transition Tableに上限
  • plmplイディオムを使う
  • 結構便利

shared_ptrキャプチャ

f:id:shigemk2:20150517145129p:plain

総括

  • マルチスレッド型は大量クライアントをさばけない
  • コールバック地獄になるので、コルーチンを使って非同期I/Oを使うべき
  • ジェネリックラムダが来たらもっと快適になるのでは?

おまけ