Método sincronizado para la concurrencia en Ruby

Posible duplicado:
¿Ruby tiene el equivalente en Java de la palabra clave de sincronización?

En Java podemos hacer un método ‘sincronizado’ simplemente usando la palabra clave ‘sincronizado’ en la definición de la función.

¿Cómo lo hacemos en ruby?

La palabra clave de sincronización no está presente en Ruby. Alternativamente, simplemente puede ajustar la llamada de método a Mutex (es decir, palabra elegante para Bloquear).

Cree un nuevo Mutex compartido para esa clase (todos deben usar el mismo Mutex (locking) para acceder a las mismas variables):

 NUM_THREADS = 4 class Foo def initialize @my_mutex = Mutex.new @my_val = 0 # should be private end def synchronize(&block) # to see what it does without the mutex in this example: # 1) comment this line @my_mutex.synchronize(&block) # 2) uncomment this line # yield end def current_value synchronize do @my_val end end def modify # the value should be 0 before and 0 after, if the Mutex is used correctly synchronize do @my_val += 1 sleep 0.25 @my_val -= 1 sleep 0.25 end end end foo = Foo.new threads = [] # spawn N threads, all trying to change the value threads += (1..NUM_THREADS).map { |i| Thread.new { puts "thread [##{i}]: modifying" foo.modify } } # spawn checking thread threads << Thread.new { # print the value twice as fast as the other threads are changing it, so we are more likely to stumble upon wrong state (NUM_THREADS * 2).times { puts "thread [check]: checking..." raise if foo.current_value != 0 # locking failed, crash sleep 0.25 } } threads.map { |t| t.join } # wait for all threads puts "even though it took a while longer, it didn't crash, everyone is happy, managers didn't fire me... it worked!" 

Ver http://apidock.com/ruby/Mutex

El progtwig se ejecuta más tiempo, debido a todos esos lockings. La velocidad depende de su implementación de ruby ​​(por ejemplo, hilos verdes, hilos nativos ..) y la cantidad de núcleos. Si desactiva la exclusión mutua en este ejemplo anterior, el progtwig se bloquea de inmediato, debido a la subida de guardia al verificar el hilo. Tenga en cuenta que el subproceso de comprobación también debe utilizar el mutex, ya que de lo contrario aún podría leer el valor en medio del cambio mediante otros subprocesos. Es decir, todos deben usar el mismo mutex para acceder a esa variable.

Para solucionar la falta de palabras clave synchronized , definí el método de synchronize que utiliza la clase definida Mutex .