1.9 では $? がスレッドスコープでなくなっているようです。

以下のように、他のスレッドで動かしたコマンドの結果が $? に表
れます。

% ./ruby -ve '
t = Thread.new { system("false") }
p $?
t.join
p $?
'
ruby 1.9.0 (2008-07-09 revision 17977) [i686-linux]
false
#<Process::Status: pid 11679 exit 1>

1.8 では $? は変化しません。

% ruby-1.8 -ve '
t = Thread.new { system("false") }
p $?
t.join
p $?
'
ruby 1.8.7 (2008-07-10 revision 17572) [i686-linux]
nil
nil

あと、ついでにいうと、1.9 では $? の初期値が 1.8 と異なり
false です。
-- 
Tanaka Akira