MRIのGVL

下の二つの記事を読んだメモ。

MRIはGVLがあるおかげで下記のようなコードを動かしても0が返る。その代わりに複数コアあっても1コアしか使えない。GVLはその名の通りグローバルなレベルのロック。コード全体にMutex#synchronizeかかってる感じらしい。ただロックがあるのとコア数との関係があるのがずっとしっくりこない…。

class Inventory
  def initialize(stock_levels)
    @stock = stock_levels
  end
 
  def decrease(item)
    @stock[item] -= 1
  end
end

40.times do
  threads << Thread.new do
    100.times do
      @inventory.decrease(:hats)
    end
  end
end
 
threads.each(&:join)
puts @inventory[:hats]

GVLができた経緯は、thread safe を考えていない c 拡張のために作られたらしい。そして作られた当時はマルチコアのCPUがなかった。 でも今はマルチコアが普通なのでGVLなくすべきでは→一回試しに別ブランチでなくしてみたけど、シングルスレッド時の性能がGVLあり版と比べてよくなかったとのこと。そして結局matz的には見送りという結論になったそうな。