Dzisiaj próbowałem wytłumaczyć współpracownikowi, że ||=
nie jest bezpieczny dla wątków w MRI. Pomyślałem, że przyjrzę się źródłu Ruby i spróbuję sprawdzić, czy mogę wskazać miejsce, w którym program planujący Ruby może zmienić kontekst wątku, ale mam problem z nawigacją po kodzie. Miałem nadzieję, że ktoś bardziej doświadczony może przejść przez pliki, które zostały trafione.W jaki sposób MRI analizuje operatory `|| =`?
Do tej pory wiem, że Bison pobiera parse.y
i generuje plik parse.c
, który wywołuje niektóre podstawowe funkcje. Widzę, że ||
jest parsowany jako tOROP
, ale potem tracę trochę na tym, co stanie się dalej
Czy jest też jakieś narzędzie, takie jak Ripper, którego mogę użyć, aby ułatwić ten proces? (I w tym przypadku byłoby pomocne, gdyby ktoś mógł wskazać mi gdzie jest zdefiniowany kod źródłowy Rippera)
To operacja nieatomowa, więc nie jest bezpieczna dla wątków. Jakie jest konkretne pytanie? Jeśli potrzebujesz bezpieczeństwa wątku, musisz o to poprosić. – tadman
Co czyni go nieatomowym? Chciałbym móc śledzić kod źródłowy, aby zobaczyć, co sprawia, że to prawda. –
Tak jak 'x + = 1' jest nieatomowy. Wymaga odczytu, porównania i (warunkowego) przypisania. 'x || = y' jest efektywnie' x = x || y' lub 'x = y chyba (x)' w zależności od tego, jak konkretnie chcesz się dostać. Zauważ, że w obu przypadkach przed przypisaniem wymagane jest przeczytanie i porównanie (nie * false *). Wszystko może się zdarzyć w tej luce. Możesz przyjrzeć się temu, co MRI kodu bajtowego wyraża to stwierdzenie, aby wiedzieć, co dzieje się wewnętrznie. – tadman