2012-08-15 17 views

risposta

9

Here is a gem che potrebbe fornire quello che ti serve (trovato linked from here). The code is clean and compact enough to quickly understand (è fondamentalmente un Mutex, come tutti gli altri hanno suggerito), che dovrebbe darti un buon punto di partenza se vuoi scrivere il tuo wrapper Mutex.

Un esempio leggermente modificata da 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

Non credo che Ruby ne abbia uno. Tuttavia, c'è uno Mutex che puoi usare per imitarne uno.

1

Non in modo nativo, ma è possibile ottenere un po 'di atomicità utilizzando la classe Mutex.

Probabilmente si potrebbe implementare il proprio AtomicString, ad esempio, utilizzando un Mutex.

3

Va notato che l'implementazione tipi atomici in termini di mutex sconfigge lo scopo di utilizzare l'astrazione 'atomico'.

Le corrette implementazioni atomiche emettono codice che sfrutta l'istruzione di confronto e scambio della CPU.

2

Usa Mutex come suggerito in questo modo:

i = 0 
lock = Mutex.new 

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