原です。
In message "[ruby-list:14475] Re: ConditionVariable (thread.rb)"
on 99/05/24, Shugo Maeda <shugo / netlab.co.jp> 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 の引数は何に
使われるの?ってことになる。
あれれっ、もしかして(あ)も(い)もデッドロックする?