15

Ruby 是否具有原子变量,例如JavaAtomicIntegerAtomicBooleanJava?

4

5 回答 5

10

这是一个可以提供您需要的宝石(从此处找到链接)。代码干净紧凑,足以快速理解(它基本上是一个互斥锁,正如其他人所建议的那样),如果您想编写自己的互斥锁包装器,这应该为您提供一个很好的起点。

来自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
于 2012-08-15T16:40:50.347 回答
6

应该注意的是,根据互斥体实现原子类型违背了使用“原子”抽象的目的。

适当的原子实现会发出利用 CPU 的比较和交换指令的代码。

于 2013-01-20T01:15:33.090 回答
2

按照建议使用互斥锁,如下所示:

i = 0
lock = Mutex.new

# Then whenever you want to modify it:
lock.synchronize do
  i += 1
end
于 2016-09-30T18:27:31.807 回答
1

我不认为Ruby有一个。但是,有一个Mutex可以用来模仿。

于 2012-08-15T15:43:58.797 回答
1

不是本机的,但您可以使用Mutex该类获得一些原子性。

AtomicString例如,您可以实现自己的Mutex.

于 2012-08-15T15:44:43.790 回答