先日のご助言について、もう少しお教えいただけますでしょうか?

At Fri, 11 Oct 2002 22:51:20 +0900,
m_seki / mva.biglobe.ne.jp wrote:
> 次の疑似コードでは、返信のタプルにエンジン側の処理スレッドを
> 渡しています。Thread#valueなので例外も受けとれると思います。
> また、TupleSpaceを介さずに結果をうけとるので、検索結果が
> 大きい時などには、効率がいいかもしれません。

> エンジン側
> 
>   while true
>     tuple = ts.in([:find, nil, nil])
>     thread = Thread.new(tuple[2]) { |arg| find_it(arg) }
>     ts.out([:find_result, tuple[1], DRbObject.new(thread)])
>     trhead.join
>   end

この方法を試しておりまして、上記コード例の"thread.join"を省略しても良さ
そうに思えるのですが、ここでスレッドの完了を待つ必要というか、理由はどの
ようなものでしょうか?

GCの関係かと思いましたが、TupleSpaceへ投入したスレッドは参照され続けてい
ることになって、要求側がタプルを取り出すまではGCの対象になりませんよね?

生成したスレッドの終了を待たずに次のタプルを取り出すことで、多数のスレッ
ドを生成してしまわないようにする仕組みかとも思いましたが、それでは多数の
処理要求を受けた際に1つずつ処理することになるような...。そのような負荷の
抑制が狙いでしょうか?

また、find_it内で例外が発生する場合に備えて次のようにする必要があると理
解していますが、正しいでしょうか?

  begin
    thread.join
  rescue
  end

短いコードを動かしつつ試しておりますが、誤解しているような気がして不安な
のです。よろしければご指摘をお願いします。 >皆様

///// ------------------------------------------------------------------
-O-O-    斉藤 秀格 (SAITO Shukaku) @ PUGH (Palm Users Group in Hokkaido)
  _      mailto:shukaku / sai10.nu    (ぱふ)   http://www.pugh.palm-j.com/