2013/05/02
Sayonara Tcl/Tkで、SQLiteStudioの作者がTcl/TkからC++/Qtへの移行の理由としてTclのshare nothingなスレッドモデル(が不便なこと)を挙げている。で、comp.lang.tclでの議論をリンクしてるので読んでたんだけど。
Share nothing派 (各スレッドが独立した実行状態(インタプリタ)を持ち、状態を持つオブジェクトを共有しない) の人たちが対比として挙げるのがGlobal Interpreter Lockなのは何でだ?
各スレッドは独立したインタプリタを持っているが、オブジェクトの共有は許す、っていうモデルだって当然あり得るわけで、そこではボトルネックになるGILは存在しないわけだが。もちろん状態共有するオブジェクトは個別に排他制御する必要はあるけど。
つうか普通のネイティブスレッドだってスタックは共有しないんだし、なぜshared nothingじゃなければglobal interpreterという議論になるのかわからん。
もちろん、参照カウントを使うメモリ管理はオブジェクト共有とすさまじく相性が悪いわけで、参照カウントを使いたかったら確かにその2択になるかもしれんけど。そりゃ参照カウントなんてのを選んだせいだわな。
Share nothingが悪いとは思わないというか、むしろ綺麗にモデル化できるならそっちの方が良いと思う。で、多分その綺麗なモデルというのは、共有したい大きな状態があったらそれぞれにひとつエージェントスレッドを当てる、という感じになるだろう。つまりオブジェクトを作るのと同じくらい軽くスレッドが作れることが重要。そうなるとネイティブスレッドと言語スレッドを1対1にするのはあまりうまくない戦略じゃないかと思う。そのへんまで考えてshare nothingにするなら良いんじゃないかなあ。
Tags: Programming, Tcl, Erlang
Post a comment