From: senda@... Date: 1998-02-25T17:18:51+09:00 Subject: [ruby-list:6756] Re: Mutex/ConditionVariable/Queue From: shugo@po.aianet.ne.jp (Shugo Maeda) Subject: [ruby-list:6754] Re: Mutex/ConditionVariable/Queue Date: Wed, 25 Feb 1998 15:44:47 +0900 Message-ID: <199802250616.GAA01595@soleil.localnet.or.jp> shugo> 前田です。 shugo> shugo> # Reply-Toが設定されているようですが、意図されているのでしょうか? すいません。.emacsを編集したあとemacsを立ち上げ直していませんでした。:-( shugo> In message "[ruby-list:6752] Re: Mutex/ConditionVariable/Queue" shugo> senda@ic.rdc.ricoh.co.jp wrote: shugo> shugo> |shugo> |>今JavaでMutexとConditionVariableを作っているのですが shugo> | shugo> |JavaでConditionVariableがいる理由がわからないのですが。 shugo> | shugo> |# つくってみたかっただけなのかな :-) shugo> shugo> いえ、違います:-) shugo> shugo> |Javaのsynchronized宣言 shugo> /java.lang.object.wait()/java.lang.object.notify() shugo> |はこのConditionVariableを隠蔽するための機構です(モニターと呼ばれる)。 shugo> shugo> これは知っています。 shugo> # というかMutex/ConditionVariableはJavaのモニタ機構を使って実装して shugo> # います。 そうだろうと想像していました。 shugo> fj.comp.parallelで話題になったので詳しくはそちらを見ていただけると shugo> ありがたいのですが、 久しぶりにnewsをのぞいてみて文脈は理解しました。 shugo> Javaのsynchronized構文ではブロック構造になるの shugo> で任意のスコープで排他制御を行えません。 これはあんまり強い制限ではないとはおもいますが(排他制御を行う部分を synchronized methodにしてやればよい)、 shugo> また、Javaでは条件変数がリソースにつき一個ずつしか持てないことに shugo> なるのですが、条件変数は各リソースではなく、条件の待ち方の個数に shugo> 対応します。 shugo> つまりリソースは一個でも条件変数が複数という場合がありうるのですが、 shugo> JavaだとnotifyAllですべてのスレッドを起こさないといけないことに shugo> なります。 shugo> これは何回か思ったことがあります。 元々のHoareのモニタ機構は条件変数が複数宣言できるはずです。 shugo> というわけでMutex/ConditionVariableが欲しい、という話になって shugo> 実装してみたわけです。 shugo> ただ、モニタ機構は素人にとっては使いやすい機構だといえます。個人的経験では 排他制御の8ー9割は単にmutex(synchronized)を書くだけだし、条件変数を使う 場合でもそんなに複雑なことをしたおぼえはありません(そんなことはないという 人は当然いるとは思いますが)。 ということでRubyに話をもどすと Mutex.shinchronize {...} と前田さんのConditionVariableの組合わせはインター フェースとしては悪くない気がします。 ただこいつらがプリミティブでないとするとスレッドのスケジューリングはどうな っているのかなという疑問がでてくるのですが。 :-) # threadの実装は良く知らないのですが、signal()のあとどこのthreadに制御を # 移すかがキモらしい。 S.Senda