From: Shin-ichiro Hara Date: 1999-05-24T20:42:39+09:00 Subject: [ruby-list:14478] Re: ConditionVariable (thread.rb) 原です。 In message "[ruby-list:14475] Re: ConditionVariable (thread.rb)" on 99/05/24, Shugo Maeda writes: | |前田です。 |> def enq(v) |> @mutex.synchronize { |> @full.wait if count == @max |> ... |> } |> end |> |> と書けるようになると synchronize と wait が同じ @mutex を扱って |> いることが隠れてまた見難い気もします。 | |うーん、でも、コードを書く人にとっては自明なはずですし、逆に読む |人にとっては(その部分に問題がないかぎり)気にしなくていい部分なの |ではないでしょうか。 これは感覚的な問題なんで、、、確かに今の仕様で問題はないです。 |> def enq(v) |> @full.synchronize { |> @full.wait if count == @max |> ... |> } |> end |> |> みたいに ConditionVariable#synchronize を作るのはいかが? | |うーん、そこまでいくとそれはもはや条件変数とは呼ばないような。 |排他制御したいのは「バッファがいっぱいになっている」という条件で |はないので、やはり@full.synchronize {...}というのは無理があるので |はないでしょうか。 その通りで、条件変数とはいい難い感じはしてくるわけだけど、、 つまり、条件変数が mutex と不可分と考えるなら、Mutex の幾つかのメ ソッドを持っていてもいい気がするし、mutex と別ものとするなら wait に mutex を(ひとつ)解放するメカニズムを組み込むのは変な気がする んです。例えば (あ) class ConditionVariable def wait(mutex) mutex.unlock @waiters_mutex.synchronize { @waiters.push(Thread.current) } Thread.stop mutex.lock end end ... def enq(v) @mutex.synchronize { @full.wait(@mutex) if count == @max @q.push v @empty.signal if count == 1 } end は、 (い) class ConditionVariable def wait2 @waiters_mutex.synchronize { @waiters.push(Thread.current) } Thread.stop end end ... def enq(v) @full.wait2 if count == @max @mutex.synchronize { @q.push v @empty.signal if count == 1 } end と書いてもほとんど変わらないわけで、では wait の引数は何に 使われるの?ってことになる。 あれれっ、もしかして(あ)も(い)もデッドロックする?