Threadを実装したい
xtalは既に軽量Threadであるfiber*1を実装しています。
この軽量Threadは、役には立つものの、マルチCPUの恩恵を授かる事はできません。
PS3等を見て分かるとおり、マルチCPUはこれから普通にあるものとなるのは確実なので、最低限の対応*2として、native threadをサポートしようと思い立ちました。
id:hzkrさんの、RubyのYARVはどうやってnative threadをサポートしてるかの解説を参考にさせていただきました。
http://d.hatena.ne.jp/hzkr/20070402
現在、YARVはロックを獲得した一つのthreadだけが動くようです。
どこかでPythonもこのような実装になってると聞きました。Pythonでは参照カウンタを併用したGCとなってるので、そういう風になってるいるらしいです。*3
xtalも参照カウンタをオブジェクトが保持しているので、Threadを縦横無尽に稼動させると、Any変数の書き込み一つでもロックを取らないといけません。これでは速度が出ません。
よーしxtalも同じようにしよう、と思いましたが、よく考えたらこれでは結局マルチCPUの恩恵に授かれません。
色々悩んだ結果、仮想マシン内部では複数のスレッドが同時に動くようにして、仮想マシン外部に出るのは一つのスレッドのみ、という方向になりました。
xtalの仮想マシン内部では速度確保のため、参照カウンタ操作を省いているので参照カウンタが狂うことはありません。
今の手元では次のようなコードが動いています。
fib: fun(i){ if(i<2){ return 1; }else{ return callee(i-2) + callee(i-1); } } thread::create(fun(){ println(fib(33)); }); println(fib(33));
ほぼ同じタイミングで答えが出力されました。多分並列に動いています。
今後色々試して、本当におかしくならないか、調査していきたいと思います。