なかだです。

 関数の中からThread#runを使うと、そのスレッドとスコープを共有
する親スレッドの$_, $~が、子スレッドのもので上書きされてしまい
ます。でも逆や、直接runしたときは起きません。1.4,1.6,1.7全て同
様です。

def foo(t)
  t.run
end

t = Thread.start do
  t = $_= "sub"
  loop{Thread.stop;puts "sub:#$_"}
end

$_ = "main"
t.run			# => sub:sub
puts "main:#$_" 	# => main:main
foo(t)			# => sub:sub
puts "main:#$_" 	# => main:sub

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦