こんにちは、高石です。

From: "U.Nakamura" <usa / osb.att.ne.jp>
Subject: [ruby-list:36059] Re: Windows で Thread

> Windows上じゃなくても同じ結果になります。
> RubyのThreadはそういうものだと思いますです。
> 
> http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Thread
> によると、
> 
>   Ruby のスレッドスケジューリングは優先順位付のラウンドロビン
>   です。一定時間毎、あるいは実行中のスレッドが権利を放棄したタ
>   イミングでスケジューリングが行われ、その時点で実行可能なスレ
>   ッドのうち最も優先順位が高いものにコンテキストが移ります。
> 
> となっています。
> 今回の例だと、生成された各々のスレッドが短いので、各スレッドは
> 規定時間を消費する前に終了してしまっています。
> ループ回数を十分大きくすれば、ちゃんと実行がスイッチされてるこ
> とが確認できると思います。

出力を全て書こうとして短くしたのがよくありませんでしたね。
そうではなく、どんなに時間がかかってもスイッチされないのです。
ループ回数を10000にしても結果は変りません。

例えば以下のコードは、何秒待っても終了してくれません。

require 'timeout'

timeout(3) do
  loop { puts Time.now }
end

いろいろ試していて気づいたのですが、puts の代りに p を使うと
うまく動くようです。
先のメールの例でも puts を p にすると、各スレッドの出力が混
ざって出てきました。
/--------------------------------------------------------/
  高石 勇人 < rio-t / presen.to >
  PGP Key(RSA): http://rio-t.presen.to/pgp/mykey.asc
         (DSS): http://rio-t.presen.to/pgp/mykey-dss.asc
/--------------------------------------------------------/