Сегодня я пытался объяснить коллеге, что ||=
не является потокобезопасным в МРТ. Я решил, что посмотрю на источник Ruby, чтобы попытаться посмотреть, могу ли я указать место, где планировщик Ruby мог бы переключать контекст потока, но у меня возникли проблемы с навигацией по коду. Я надеялся, что кто-то более опытный сможет пройти через файлы, которые попали.Как MRI анализирует оператор `|| =`?
До сих пор я знаю, что Bison принимает parse.y
и создает файл parse.c
, который вызывает некоторые основные функции. Я вижу, что ||
разобран как tOROP
, но потом я немного потерял то, что произойдет дальше
Также есть какой-то инструмент вроде Ripper, который я могу использовать, чтобы сделать этот процесс немного проще? (И на этой ноте было бы полезно, если бы кто-то мог указать мне, где определяется исходный код Ripper)
Это неатомная операция, поэтому она не является потокобезопасной. Какой здесь конкретный вопрос? Если вам нужна безопасность потоков, вы должны попросить об этом. – tadman
Что делает его неатомным? Я хотел бы иметь возможность следить за исходным кодом, чтобы узнать, что делает это правдой. –
Так же, как 'x + = 1' является неатомным. Для этого требуется чтение, сравнение и (условное) назначение. 'x || = y' эффективно' x = x || y' или 'x = y, если только (x)' в зависимости от того, как именно вы хотите получить. Обратите внимание, что в обоих случаях перед назначением требуется чтение и сравнение (не * false *). В этом промежутке может случиться что-нибудь. Возможно, вам захочется взглянуть на то, что байт-код MRI выражает это утверждение, чтобы знать, что происходит внутри. – tadman