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 APIwin32実装を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本体にいれるかどうかは、今後githubissue上で議論するとして、ひとまず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です。