Имеет ли 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
.