From: Shin-ichiro Hara Date: 1999-05-25T16:34:31+09:00 Subject: [ruby-list:14509] Re: ConditionVariable (thread.rb) 原です。 In message "[ruby-list:14504] Re: ConditionVariable (thread.rb)" on 99/05/25, Shugo Maeda writes: | |前田です。 | |At Tue, 25 May 1999 12:33:46 +0900, |Shin-ichiro Hara wrote: |> class ConditionVariable |> def wait(mutex) |> mutex.unlock |> @waiters_mutex.synchronize { |> @waiters.push(Thread.current) |> } |> sleep 0.1 #KOREKORE |> Thread.stop |> mutex.lock |> end |> end |> |> としてみると件のスクリプトは dead lock を起こします。 | |これがデッドロックするのは、おそらくsleepでスレッドの切り替えが起 |こってしまうためですよね。 そうです。そのために sleep 入れてみたんです。 |本来、Thread.critical = trueとしてThread.stopするまではスケジュー |リングイベントが起こらないようにするべきなんです。 |でないと、Thread.stopする前にrunを呼ばれてしまう。 そうではなくて、Thread.stop する時は排他制御されていないのが 問題なのでは? Thread.critical = true しても、Thread.stop し たとき他に制御が移りますね。そっちでまた Thread.stop して、、 とうとうみんな stop するのでは? #別件: #Thread.critical = true でも sleep 0.1 すると他に制御が移るけど #これは望ましい仕様でしょうか? |# monitor.rbではThread.critical = trueにしてます。 monitor.rb って難しい。これの ConditionVariable で TinyQueue は どう書きますか? |# thread.rbに入っているのは書きかけのConditionVariableのコードが |# 残ってしまっているのではないでしょうか。 そうですか。 |> つまりキューの保護と ConditionVariable の保護に同じ |> mutex を使うのはまずいです。 | |ConditionVariableの保護に使うmutexとはどういう意味ですか? |# waitの引数のことかな。 そういうつもりでしたが、間違った語法と間違った内容でした。 そもそも「wait(mutex) に渡す mutex とはどんなものですか?」という のが問題だったんですが、どう答えるのがいいのかなあ。