Является ли назначение атомарной операции в МРТ рубина? - PullRequest
1 голос
/ 06 марта 2019

Допустим, у меня есть два метода в моем классе.

def set_val(val)
  @val = val
end

def get_val
  @val
end

Я создам несколько потоков для вызова set_val с разными значениями. Гарантируется ли, что чтение из @val вернет правильное значение, то есть не последнее присвоенное значение, а значение, которое было передано set_val? Могу ли я получить что-то странное при чтении? Является ли операция присваивания атомарной? Является ли он неделимым независимо от количества потоков?

1 Ответ

2 голосов
/ 06 марта 2019

Это немного зависит от используемой вами реализации Ruby. Что касается MRI Ruby (Ruby «по умолчанию»), это безопасная (атомарная) операция из-за ее глобальной блокировки интерпретатора, которая защищает некоторые операции, такие как назначения от bein, прерванные переключателями контекста.

JRuby также гарантирует , что некоторые операции являются поточно-ориентированными, включая присваивание переменным экземпляра.

В любом случае, пожалуйста, примите во внимание, что любой такой параллельный доступ может быть сериализован случайным образом. То есть вы не можете гарантировать, какие потоки назначают первыми, а какие последними, если вы не используете явные блокировки, такие как Mutex .

...