Ruby有原子变量吗?

时间:2012-08-15 15:40:28

标签: ruby

Ruby是否有原子变量,如Java中的AtomicIntegerAtomicBoolean

5 个答案:

答案 0 :(得分:9)

Here is a gem可能会提供您所需要的内容(找到linked from here)。 The code is clean and compact enough to quickly understand(它基本上是一个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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

按照建议使用Mutex:

i = 0
lock = Mutex.new

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

不是原生的,但你可以使用Mutex类获得一些原子性。

您可以使用AtomicString实现自己的Mutex