まつもと ゆきひろです
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でブロックしちゃうせいですね.ほとんどバグの領域
だと思います.次のリリースで修正しようと思います.
まつもと ゆきひろ /:|)