Generando una condición de carrera con MRI
Me preguntaba si es fácil hacer una condición de carrera usando MRI ruby (2.0.0) y algunas variables globales, pero resulta que no es tan fácil. Parece que debería fallar en algún momento, pero no lo hace y lo he estado ejecutando durante 10 minutos. Este es el código que he estado tratando de lograrlo:
def inc(*)
a = $x
a += 1
a *= 3000
a /= 3000
$x = a
end
THREADS = 10
COUNT = 5000
loop do
$x = 1
THREADS.times.map do Thread.new { COUNT.times(&method(:inc)) } end.each(&:join)
break puts "woo hoo!" if $x != THREADS * COUNT + 1
end
puts $x
¿Por qué no puedo generar (o detectar) la condición de carrera esperada y obtener la salida?woo hoo!
en Ruby MRI 2.0.0?