Имеет ли Ruby атомные переменные?

Имеет ли Ruby атомные переменные, например AtomicInteger или AtomicBoolean в Java?

Ответы

Ответ 1

Вот жемчужина, которая может предоставить вам то, что вам нужно (здесь найдено ). Код чист и достаточно компактен, чтобы быстро понять (в основном это Mutex, как и все остальные), который должен дать вам хорошую отправную точку, если вы хотите напишите свою собственную оболочку Mutex.

Немного измененный пример из github:

require 'atomic'

my_atomic = Atomic.new('')

# set method 1:
my_atomic.update { |v| v + 'hello' }

# set method 2:
begin
  my_atomic.try_update { |v| v + 'world' }
rescue Atomic::ConcurrentUpdateError => cue
  # deal with it (retry, propagate, etc)
end

# access with:
puts my_atomic.value

Ответ 2

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

Надлежащие атомные реализации испускают код, который использует команду сравнения CPU и свопинга.

Ответ 3

Использовать Mutex, как предлагается, например:

i = 0
lock = Mutex.new

# Then whenever you want to modify it:
lock.synchronize do
  i += 1
end

Ответ 4

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

Ответ 5

Не изначально, но вы можете получить атомарность, используя класс Mutex.

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