程序:
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)。
答案 0 :(得分:0)
Ruby(MRI)的默认解释器并不是并行执行线程。阻止您的竞争条件引入随意意外行为的机制是全局解释器锁(GIL)。
您可以在此处了解更多相关信息,包括非常类似的演示:http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil