Ruby 中未发生互斥

Mutual Exclusion not happened in Ruby

节目:

def inc(n)
    n + 1
end

sum = 0
threads = (1..10).map do
    Thread.new do
        10_000.times do
            sum = inc(sum)
        end
    end
end
threads.each(&:join)
p sum

输出:

$ ruby MutualExclusion.rb 
100000
$ 

我对上述程序的预期输出小于 100,000。因为,上面的程序创建了 10 个线程,每个线程 将共享变量 'sum' 更新为 10,000 次。但是在程序执行过程中,肯定会发生互斥。因为, 这里不处理互斥。所以我预计输出少于 100,000。但它恰好给出了 100,000 作为输出。怎么样 发生了什么?谁在这里处理互斥?以及我如何试验这个问题(ME)。

Ruby (MRI) 的默认解释器不并行执行线程。防止竞争条件引入意外行为的机制是全局解释器锁 (GIL)。

您可以在此处了解更多信息,包括非常相似的演示:http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil