C++で継続・コルーチン
タスク定義をどうするかが問題。なんとかcontinuation(継続)をC++でかけないものか。
必要なのは、いわゆるプログラムカウンタ(+レジスタ群)の保存と、スタック上のローカル変数データの保持。
FSMモデルならなんとかかけます。(参考:d:id:yaneurao:20040525)
保存が必要なデータはメンバ変数にすればOK。でもこれだとプログラムが恐ろしく汚くなるんだよな。
やりたいことはスタックポインタ入れ替えてsetjmpなんだけど、これのポータブルな実装を自前でやるのは絶望的すぎる。というか例外使ってるプログラムだとどうなるんだっけ?
と、書いてる途中にBinary Hacksに似たようなネタがあったのを思い出す。
ありましたありました。
- Portable Coroutine Library
- GNU Pth
- Boost::Coroutine
Boost好きとしてはBoost::coroutineかと思いきや、draftっぽいので回避。
PCLとPthを検討してみます。
PCLとGNU Pth
5分で両方のAPIリファレンスを流し読みしただけなので、あんまり参考にしないように。
Pthはpthread互換APIを目指してるようなかんじ。APIがみょーに多い。システムコールがスレッドの中で呼ばれることを気にしている様子。(あの悪しきスレッドキャンセルへの対応をきちんとやっている印象)
PCLは500行未満のライブラリで、本当にsetjmp/longjmp+スタック交換のみみたい。
というわけでPCLを使おうと思うのだけれども、例外処理がどうなるのか不安。Windowsゲームプログラミング2によると、Windows/VC++環境だとSEH用のスタックポインタがfs[0]に保存されているらしい。これを退避させておけばよさそうだ。g++の場合は例外処理の実装が2種類あったはずだし、もうちょっとややこしくなりそう。調査が必要。