[ruby-list:3025] Re: thread and fork

From: matz@... (Yukihiro Matsumoto)
Date: 1997-05-28 02:01:17 UTC
List: ruby-list #3025
まつもと ゆきひろです

In message "[ruby-list:3023] Re: thread and fork"
    on 97/05/27, Jun Kuroda <jkuro@dwe.co.jp> writes:

|黒田です。

|その後ですが、
|
| > >  forkはメモリ空間を共有しない
|
|-おおざっぱに --
|
|class Log
|  #構造体定義もある
|  ...
|end
|
|def session
|  log = Log.new
|  log.set構造体
|  ...
|end
|
|thread.start{
|   session()
|}
|- --
|
|みたいなプログラムで、thread 間で log の構造体を共有してるよ
|うなのです。こう書けば共有しないような気がしたのですが、どう
|書くのが正しいのでしょう?

それは「名前空間を共有しない」ですね.メモリ空間を共有しない
ということはどうやっても同じオブジェクトを参照できないという
意味です.実用上はあまり変わりなく使えますけど.

良くやるのはイテレータブロック内で初出のローカル変数は共有さ
れないことを利用して

  Thread.start do
    log = Log.new
    log.set構造体
    ...
  end

ですね.ここで「うっかり」イテレータブロックの外側でlogって
名前の変数を使っちゃうと痛い目に遭いますが.

| > >  forkの切替えのタイミングは不正確/threadはもっと不正確
|
|について。system(とっても重いelispプログラム) を呼ぶ thread 
|が処理を奪ったままなので, 試しに(懲りずに)fork を狭んでみると
|うまく行きました。そんなもんなんでしょうか。

systemがwaitでブロックしちゃうせいですね.ほとんどバグの領域
だと思います.次のリリースで修正しようと思います.

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

In This Thread