From: matz@... (Yukihiro Matsumoto) Date: 1997-01-16T21:08:05+09:00 Subject: [ruby-list:1728] Re: [Q] Use of Thread and Mutex まつもと ゆきひろです. In message "[ruby-list:1724] Re: [Q] Use of Thread and Mutex" on 97/01/16, sinara@blade.nagaokaut.ac.jp writes: | |原です。 | |一連の thread がらみのレポートに対して、まつもとさんの反応が |あまりないけど(^^; 、、、単なるぼやきだと思われたかな? いやあ,ちゃいます.本業とのコンテキストスイッチの間に情報 が落ちちゃったみたいです(ぼけてるともいう). |【1】[ruby-list 1669] で述べた |が Segmentation fault で落ちる件ですが、最新バージョンでは落ちなく |なりました。 こっそり直しました.見つかっちゃいましたね. |【2】[ruby-list 1696] で述べた thread.rb の class Queue は、うま |く動作しないことがあるのではないかという話ですが、確かに次のスク |リプトは、結構早く止まってしまいます。 |やはり、まずいみたいです。 そうですね.popを保護したらちゃんと動作するようになったみた いです.うーむ,threadは難しい. | |【3】[ruby-list 1696] で言ったように、Hash#[]= は、thread に対し |て保護されていないようです。 |これを動かすと、20回に1回ほど10秒ぐらいで停止します。 |Thread.exlusive を使うとこれは起こらないので、class Mutex の方 |も若干甘い所があるのではないでしょうか? そうかもしれません.こちらも書き換えてみました.たぶん,直っ たのだと思います. まつもと ゆきひろ /:|) --- thread.rb~ Thu Dec 19 10:20:54 1996 +++ thread.rb Thu Jan 16 20:18:01 1997 @@ -41,10 +41,12 @@ end def unlock - @locked = FALSE - if w = @waiting.shift - w.run + w = FALSE + Thread.exclusive do + @locked = FALSE + w = @waiting.shift end + w.run if w end def synchronize @@ -95,19 +97,21 @@ end def push(obj) - @que.push obj - if t = @waiting.shift - t.run + t = FALSE + Thread.exclusive do + @que.push obj + t = @waiting.shift end + t.run if t end def pop non_block=FALSE - if @que.length == 0 - raise ThreadError, "queue empty" if non_block - @waiting.push Thread.current - Thread.stop + Thread.exclusive do + return @que.shift if @que.length > 0 end - @que.shift + raise ThreadError, "queue empty" if non_block + @waiting.push Thread.current + Thread.stop end def empty?