Ruby19ネタ。 2本目のスレッドを生成して Mutex#synchronize で制御しあおうとしても, 片っぽの方しか実行されない。
mutex.rb
#!/usr/bin/env ruby # coding: euc-jp require 'thread' m = Mutex.new x = 1 t = Thread.new do # ここは子のみが実行するところ 5.times do m.synchronize { x=5; sleep 0.2 } end end while t.alive? m.synchronize { STDERR.printf("x=%dに1足すと:", x) sleep 0.05 x += 1 STDERR.printf("%d\n", x) } end t.join
Ruby19だと子スレッドの方に制御が行かない。なじぇ。
Mutex#synchronize を持ち出すと、明示的に Thread.pass しないと 別スレッドに制御が行かなくなるようだ。Monitorも同じ。 各スレッドに Thread.pass を追加したらRuby18での挙動と同じになった。
#!/usr/bin/env ruby # coding: euc-jp require 'thread' m = Mutex.new x = 1 t = Thread.new do # ここは子のみが実行するところ 5.times do m.synchronize { x=5; sleep 0.2 } Thread.pass end end while t.alive? m.synchronize { STDERR.printf("x=%dに1足すと:", x) sleep 0.05 x += 1 STDERR.printf("%d\n", x) } Thread.pass end t.join