gpt4 book ai didi

ruby 简单的竞争条件问题

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:05 24 4
gpt4 key购买 nike

我遇到了这个竞争条件的例子:

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

线程并行运行,有可能当一个线程读取 sum 的值时,另一个线程完成它的递增,但前者即将完成它自己对旧值的递增,因此 sum 不会改变。

但我想知道,为什么当我将行 'sum = inc(sum)' 替换为 'sum += 1' 时,输出似乎总是正确的。

这是为什么?

是不是因为调用方法的开销比仅仅进行变量赋值要大得多,因此一些线程“不同步”导致输出不正确?

我假设,即使是直接和 += 1 我仍然能够观察到竞争条件,但前提是我一直在做一个更长的求和循环等等?

最佳答案

Is it because the overhead of calling a method is so huge compared to just doing a variable assignment and thus some threads 'get out of sync' causing the output to be incorrect?

是的。要验证它,只需增加计数器并运行几个测试。我将它增加到 100_000.times 结果如下:

$ seq 5 | xargs -L 1 ruby a.rb 100000
451167
472581
464413
442191
454204

嗯,看起来不太好,是吗?

所以,是的,递增在 Ruby 中不是原子的(而且我怀疑它在很多语言中都是原子的)。但是有帮助类来实现这种行为;例如,this one .

关于ruby 简单的竞争条件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com