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