6

MRI ruby​​(2.0.0)といくつかのグローバル変数を使って競合状態を作るのは簡単なのだろうかと思っていたのですが、そう簡単ではないことがわかりました。ある時点で失敗するはずですが、そうではなく、10分間実行しています。これは私がそれを達成しようとしてきたコードです:

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

予想される競合状態を生成 (または検出) できずwoo hoo!、Ruby MRI 2.0.0 で出力を取得できないのはなぜですか?

4

1 に答える 1