まつもと ゆきひろです

In message "[ruby-list:3084] Re: thread and fork"
    on 97/06/06, Jun Kuroda <jkuro / dwe.co.jp> 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 は他のスレッドの迷惑になるから
避けよう」ということになるのではないでしょうか?

                                まつもと ゆきひろ /:|)