下の二つの記事を読んだメモ。
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的には見送りという結論になったそうな。