15

Ruby には、Javaのような原子変数がありますAtomicIntegerか?AtomicBoolean

4

5 に答える 5

10

これがあなたが必要とするものを提供するかもしれない宝石です(ここからリンクされています)。コードはクリーンでコンパクトなので、すぐに理解できます(他の人が示唆しているように、基本的には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
于 2012-08-15T16:40:50.347 に答える
6

ミューテックスの観点からアトミック型を実装すると、「アトミック」抽象化を使用する目的が無効になることに注意してください。

適切なアトミック実装は、CPU のコンペア アンド スワップ命令を利用するコードを発行します。

于 2013-01-20T01:15:33.090 に答える
2

次のように提案されているように Mutex を使用します。

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を模倣するために使用できるMutexがあります。

于 2012-08-15T15:43:58.797 に答える
1

Mutexネイティブではありませんが、クラスを使用してある程度の原子性を得ることができます。

AtomicStringたとえば、 を使用して、独自の を実装できますMutex

于 2012-08-15T15:44:43.790 に答える