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
节目:
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