From: Yukihiro Matsumoto Date: 2007-03-15T12:10:36+09:00 Subject: [ruby-dev:30585] Re: help: lib/shell for ruby 1.9 まつもと ゆきひろです In message "Re: [ruby-dev:30553] help: lib/shell for ruby 1.9" on Tue, 13 Mar 2007 19:41:13 +0900, keiju@ishitsuka.com (Keiju ISHITSUKA) writes: |こんどは, lib/shell を ruby 1.9(YARV)に対応しようと思っているのですが, |Thread.criticalを多用しているので, どうしたもんだかと悩んでします. 確かに。 |まず, lib/shell では, カレントディレクトリ を Shellオブジェクトごとに |持てるようにしています. で以下のように Thread.critical を用いて他のス |レッドが他のスレッドがカレントディレクトリを変更しないようにしています. えーと、まず第一にThread.criticalを使えばコンテキストスイッ チが起きないと言うのは誤解です。Thread.criticalはタイマーに よる切り替えを禁止するだけで、どこかで明示的なスレッド切り 替えが発生することを止められません。ということは、最初のコー ドはもともと期待するほどには安全では無かったということなのだ と思います。 なお、chdirに関してはDir.chdirをブロック付きで呼ぶという技が 使えると思います。 Dir.chdir(@shell.cwd) do @files = Dir[patter] end 残念ながらumaskには同様の手段が用意されていません。そもそも プロセス単位の概念をスレッド単位に見せかける時点で相当無理が あるわけですが。 |それともう一つ, forkした後の子プロセス側のスレッドはどうするようになり |ましたっけ? だいぶ前の版からkillするようになった気もしているのですが? 1.8ではforkした以外のスレッドは全部死にます(でもOSXでは動か ないとか [ruby-dev:30581])。trunkでどうなのかはちょっと今は 分かりません。