Ruby

时间:2016-07-11 11:28:08

标签: ruby-on-rails ruby multithreading mutual-exclusion

程序:

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)。

1 个答案:

答案 0 :(得分:0)

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

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