From: matz@... (Yukihiro Matsumoto) Date: 1997-06-06T14:08:34+09:00 Subject: [ruby-list:3085] Re: thread and fork まつもと ゆきひろです In message "[ruby-list:3084] Re: thread and fork" on 97/06/06, Jun Kuroda writes: |また、黒田です。 |ruby - version 1.0-970528 (i686-linux) & Linux 2.0.30 で |write でブロックしているようです。以下のプログラムで(a0.gz は |800KB程度) このプログラムを見る限りべつにブロックしているわけではないよ うです.ただ,busy waitを使っているのでスレッド間の実行権の 割当が不平等になっているようですが. 例えば |の結果が l.21 のifを使う場合 には |-TRUE -- |1 |2 |start |3 |end0 |end1 |4 |(略) |20 |- -- ごく正常に動作しています. |となり、end0 と end1 の間に main_a の処理が行なわれてません。 というわけではなくてmain_bの処理が十分早いのでコンテキストス イッチが発生しなかったのだと思ってください.これが正常です 一方, |特に困るわけではないですが、l.22 のifを使う場合は は |-FALSE -- |1 |2 |start |3 |(略) |12 |end0 |end1 |13 |(略) |20 |- -- startからend0までの間に実に9秒もかかっています.これは main_threadがbusy waitしているためにこれにひきづられて遅くなっ ているものと思われます. たとえば,busy waitを使わず Thread.join a で待つようにしたりするとTRUE版とほぼ同じ動作になります. というわけで結論は「busy wait は他のスレッドの迷惑になるから 避けよう」ということになるのではないでしょうか? まつもと ゆきひろ /:|)