2012-06-27 6 views
7

Z poprzednich prac w C# i Java, jestem przyzwyczajony do oświadczenia, takie jak ten nie jest bezpieczny wątku:Czy wątki Ruby nie mogą kolidować przy pisaniu?

x += y; 

Jednak nie udało się zaobserwować żadnej kolizji między wątków, gdy uruchomiony powyższy kod równolegle z Ruby.

Przeczytałem, że Ruby automatically prevents multiple threads from writing to the same data concurrently. Czy to prawda? Czy operator += jest bezpieczny dla wątków w Ruby?

Odpowiedz

2

Cóż, to zależy od twojej implementacji i wielu rzeczy. W MRI istnieje coś takiego jak GVL (Giant VM Lock), który kontroluje, który wątek faktycznie wykonuje kod jednocześnie. W MRI, tylko jeden wątek może wykonywać kod Ruby na raz. Tak więc, podczas gdy biblioteki C pod spodem mogą pozwolić na uruchomienie kolejnego wątku, podczas gdy używają CPU w kodzie C w celu zwielokrotnienia liczb olbrzymich, sam kod nie może być wykonany w tym samym czasie. Oznacza to, że instrukcja taka jak zadanie może nie działać w tym samym czasie, co inne zadanie (chociaż dodatki mogą być uruchamiane równolegle). Inna rzecz, która może się wydarzyć, brzmi: Myślę, że słyszałem, że przypisania do int s są atomowe w Linuksie, więc jeśli jesteś na Linuksie, to może być coś takiego.

+0

Każdy pomysł, jeśli GIL zostanie kiedykolwiek upuszczony dla wątku w trakcie wykonywania 'x + = y'? Czy jest to tylko kiedykolwiek nabyte i wydane na _statement_ granice? Lub granice wyższego poziomu? – sarnold

+0

Bardzo szczegółowe odpowiedzi na tematy w ogóle można znaleźć na http://stackoverflow.com/questions/56087/does-ruby-have-real-multithreading. – Chris

+0

@arnold: Wydanie GVM wszystko zależy od kodu C podległego. Na przykład w implementacji mnożenia 'Bignum', jeśli liczby są poza pewnym rozmiarem, GVL zostanie zwolniony, aby inny kod * Ruby * mógł zostać wykonany, podczas gdy C dzieli liczby. GVL naprawdę cię martwi, jeśli rozwiniesz rozszerzenia C. – Linuxios

0
x += 1 

jest równoważny pod każdym względem do

x = x + 1 

(jeśli przedefiniować +, można również automatycznie przedefiniować wynik +=)

W tym zapisie, to nie jest to wyraźniejsze Operacja atomowa, a zatem nie jest gwarantowana bezpieczna dla wątków.

+0

Rozumiem, że '+ =' używa operatora '+'. Przypuszczam, że powinienem był zawęzić moje pytanie do liczby całkowitej, ponieważ to mnie najbardziej interesuje. Chciałbym wiedzieć, co daje takie zaufanie w tej odpowiedzi. Jak już powiedziałem, znam język C# i Javę, gdzie to, co mówisz, jest prawdą. Ale do tej pory nie widziałem dowodów na to za pomocą MRI; i faktycznie to, co * udało mi się znaleźć (takie jak artykuł, do którego linkowałem w pytaniu) wydaje się sugerować coś przeciwnego. Myślę, że to, co mówię, to referencja, którą bardzo docenilibyśmy :) –

+0

Czy jesteś pewien, że żaden inny wątek wykonania nie może zaktualizować 'x' między czasem, gdy jego wartość zostanie odzyskana, a przed zapisaniem nowej wartości? – sarnold

Powiązane problemy