原です。

復活しました。条件変数の話、もう少しつき合って下さい。

In message "[ruby-list:14512] Re: ConditionVariable (thread.rb)"
    on 99/05/25, Shugo Maeda <shugo / netlab.co.jp> writes:
|
|前田です。
|
|At Tue, 25 May 1999 16:34:31 +0900,
|Shin-ichiro Hara <sinara / blade.nagaokaut.ac.jp> wrote:
|> |本来、Thread.critical = trueとしてThread.stopするまではスケジュー
|> |リングイベントが起こらないようにするべきなんです。
|> |でないと、Thread.stopする前にrunを呼ばれてしまう。
|> 
|> そうではなくて、Thread.stop する時は排他制御されていないのが
|> 問題なのでは? Thread.critical = true しても、Thread.stop し
|> たとき他に制御が移りますね。そっちでまた Thread.stop して、、
|> とうとうみんな stop するのでは?
|
|制御が移った後、どうして他のスレッドもすべてThread.stopするのですか?
|むしろ、Thread.stopで他に制御が移るのは当り前で、他に制御が移らな
|かったら条件が満たされることもないと思うのですが。

Thread.stop で他に制御が移るのは当り前なんですが、そのとき
全く排他制御がなくなってますよね。それが気妙な気がしたんで
す。どんな mutex にも lock がかかっていないので、何があって
もおかしくない状態なわけです。それでうまく行くのかどうか。
直観的にヤバそうな気がするのですが、、、

|> |でないと、Thread.stopする前にrunを呼ばれてしまう。

この事は私は十分理解していなかった様です。Thread.stop する
前に run 待ちのキューに入れられて、まだ stop してないのに
run されるという無効な動作の後で stop する。それがあのケー
スのデッドロックの直接的原因なんですね。分かりました。


|条件変数でwaitした時に、条件が満たされるために働いている他のスレッ
|ドが存在することは、絶対的な前提条件だと思います。

なるほど、そうですね。その前提条件が満たされないとしたら
ConditionVariable のライブラリの責任ではなくて、そのユーザ
ーのコードに問題があると。当り前か。(^^;

#と、いうことは条件変数を利用するプログラムはデッドロックを防ぐ
#ためかなり注意が必要になるんだなあ。例えば [ruby-list:14445]の咳
#さんの TinyQueue でいうと、wait を呼ぶのは
#
#      @full.wait(@mutex) if count == @max 
#
#と、
#
#      @empty.wait(@mutex) if count == 0 
#
#の2行だけれど、この count == @max と count == 0 が排他的な条
#件だからうまく動いているのだと言える。そうでなければデッドロッ
#クがありえる。


|> |# monitor.rbではThread.critical = trueにしてます。
|> 
|> monitor.rb って難しい。これの ConditionVariable で TinyQueue は
|> どう書きますか?
|
|ソースはややこしいですが、使い方はMutexとほとんど同じです。
|
|    @mutex = Monitor.new
|    @full = @mutex.new_cond
|    @empty = @mutex.new_cond
|
|あとはwaitさせるだけです。
|
|@full.wait_while { count == @max }

ありがとうございました。見事に動きました。

monitor.rb をちょっと眺めたんですが、この難しさの半分は excludable に
するための(石塚流?)メタプログラミングによるものですね。しかし、そこ
を飛ばしてもやっぱり難しい。


|> そもそも「wait(mutex) に渡す mutex とはどんなものですか?」という
|> のが問題だったんですが、どう答えるのがいいのかなあ。
|
|条件変数を「あるリソースが特定の条件を満たすのを待つ」ためのもの
|と考えれば、そのリソースを保護しているmutexだと考えられるのではな
|いでしょうか。
|リソースとロックは一対一対応ですが、リソースと条件変数は一対他対
|応なので、ロックと条件変数を一致させるのはやはり無理があると思い
|ます。

なるほど、これで理解しました。咳さんのプログラムがまさに「ひとつ
のロック、2つの条件変数」という好例でした。私の提案はピントはず
れでしたね。