|| = в Ruby-потоке безопасно? - PullRequest
7 голосов
/ 24 марта 2012

Не уверен, относится ли безопасность потоков даже к ||=.

Первоначально читал о ActiveSupport :: Memoizable и задавался вопросом о безопасности потоков там.

Ответы [ 2 ]

1 голос
/ 25 марта 2012

Это зависит от реализации. Имейте в виду, что x ||= y расширяется до x || x = y, и что x = y выполняется только в том случае, если x равно false или nil.

С учетом вышесказанного, реализация языка Ruby на C должна быть полностью поточно-ориентированной.

YARV использует собственные потоки для реализации параллелизма, который do выполняется в истинной параллели. Однако для обеспечения обратной совместимости была введена глобальная блокировка для всего интерпретатора .

JRuby, однако, не налагает внутренней блокировки на ваш код, поэтому вы должны вручную синхронизировать ваши вызовы при необходимости.

См. другой ответ, который я дал по теме для получения более подробной информации. Кроме того, прочитайте этот превосходный ответ от Jörg W Mittag для более глубокого взгляда на модели потоков различных реализаций Ruby.

0 голосов
/ 04 сентября 2016

Этот замечательный пост о концепции безопасности потоков в Ruby от Luca Guidi показывает, что ||= не является потокобезопасным (по крайней мере, в MRI).

...