mrubyにGVLを使ったmulti-threadingのsupportを追加する
前回mrubyのことを書いてから既に1年以上が経ち、非常にいまさら感はあるのですが、
mrubyにGVL実装版のmulti-threadingのsupportを追加してみました。
ソースコードは下記で公開しています。
crimsonwoods/mruby at implement_multithreading_support_with_GVL · GitHub
ベースにしているのはmruby 1.1.0のtagで、
下記のような変更を加えています。
- mrb_stateをmrb_vm_contextとmrb_thread_contextに分割
- GVLの実装用にmutexのAPIを追加
- GVL用のAPIを追加
- thread用のAPIを追加
- atomic命令用のAPIを追加
- threadのcontext-switch用にtimer threadを追加
- Thread class実装用のmruby-threadをmrbgemsに追加
- thread/mutex APIのpthread実装をmruby-pthreadとしてmrbgemsに追加
- thread/mutex APIのwin32実装をmruby-win32-threadとしてmrbgemsに追加
ということをしています。
threadとmutexの実装はmrbgemから初期化時に拡張できるようになっているので、pthreadやwin32 thread以外の実装を追加することも可能です。
また、thread/mutexに関して実装者が知っておくべき事項としては下記の事項です。
- mutexはnon-recursiveのみのサポートでOK
- mutexへのtry-lockは今のところ未使用(なので実装しなくても大丈夫)
- sleepに0を渡したときにthreadのtime sliceを放棄することを期待している
ちなみに、Rubyから扱えるMutexクラスは今のところ実装していません。
この変更をmruby本体にいれるかどうかは、今後githubのissue上で議論するとして、ひとまずGVL版でよければmulti-threadをサポートしたmrubyをお試し頂けるのではないかと思います。
追記
build_config.rbの書き方を記載するのを忘れていたので書いておきます。
mrbgemの追加と、multi-threadingのサポートを有効化するためのmacro定義を追加します。
conf.gem 'mrbgems/mruby-thread' # conf.gem 'mrbgems/mruby-win32-thread' # for win32 conf.gem 'mrbgems/mruby-pthread' # for Linux conf.cc.defines << %w(MRB_USE_THREAD_API MRB_USE_MUTEX_API MRB_USE_GVL_API MRB_USE_ATOMIC_API)
こんな感じです。
mruby-win32-threadとmruby-pthreadは排他なので、どちらかだけを選択してください。
あとはこれをhostとhost-debugの両方に記載すればOKです。