natknąłem się na ten przykład sytuacji wyścigu:rubin warunek prosty wyścig pytanie
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
nici biegną w pararell i istnieje szansa, że chociaż jeden wątek odczytuje wartość sumy za, drugi kończy zwiększając ją, ale były kończy właśnie własną inkrementację ze starą wartością, w wyniku czego suma się nie zmieni.
Ale zastanawiałem się, dlaczego, gdy zamieniam wiersz "sum = inc (suma)" na "suma + = 1", wynik wydaje się zawsze poprawny.
Dlaczego tak jest?
Czy to dlatego, że narzut wywoływania metody jest tak duży w porównaniu do zwykłego przypisania zmiennych, a zatem niektóre wątki "tracą synchronizację", powodując, że dane wyjściowe są niepoprawne?
Zakładam, że nawet z prostą sumą + = 1 nadal będę w stanie obserwować stan wyścigu, ale tylko wtedy, gdy robiłem znacznie dłuższą pętlę sumującą, itp.?