ねちっこくLuaを触ってみる(スレッドでハマる)

Luaスレッドで制御するオブジェクトの話。オブジェクト生成時にそのつどlua_newthread()でスレッドを作成していくと10個くらいオブジェクトを作ったところで何故か落ちてしまうことが判明。
最初にスレッドをドカッとプールに作り貯めておく方式であれば落ちないっぽい。一つのlua_Stateに作成できるスレッドの数がどれくらいかは解らないけれど、2000個くらい作ってみても平気だった。

新規に作成されたオブジェクトは、このスレッドプールからスレッドを得て、死亡時にスレッドプールに戻しておく、みたいな使い方で問題なさそう。
と思いきやLua制御オブジェクトを700個ほど出したところでやはり落ちる。まだスレッドプールには余裕があるのにナンデ?とりあえずlua_checkstack()で1024くらいを指定してスタックサイズを伸ばしてやると落ちなくなった。原因はスタックのオーバーフローだろうか?Luaスタックって自動で拡張されないのかな。

そしてやはり、スレッドプールが尽きた時に落ちてしまう危険性がある。これはかなりの不安要素。1000個くらいまで60FPSは維持できていたのでパフォーマンス的には問題なさそうなのだけど、落ちてしまうのはいただけない。

とにかく、Luaで1000も2000もスレッドを作成するのは控えたほうが良さそうだ。実際のゲームではそこまで大量のスレッドは必要ないだろうから現実的には問題ないと思う。(弾やエフェクトまでLuaスレッド制御するならともかく)