From: senda@... Date: 1998-02-25T14:59:35+09:00 Subject: [ruby-list:6752] Re: Mutex/ConditionVariable/Queue From: shugo@po.aianet.ne.jp (Shugo Maeda) Subject: [ruby-list:6747] Re: Mutex/ConditionVariable/Queue Date: Wed, 25 Feb 1998 14:00:52 +0900 Message-ID: <199802250459.EAA00708@soleil.localnet.or.jp> shugo> 前田です。 shugo> shugo> In message "[ruby-list:6746] Re: Mutex/ConditionVariable/Queue" shugo> 石塚圭樹 wrote: shugo> shugo> |>今JavaでMutexとConditionVariableを作っているのですが、Rubyでも shugo> |>使えると便利かなと思って作ってみました。 shugo> | shugo> |ConditionVariableってどんなクラスなんですか? ソースを読んでも意図がい shugo> |まいち良くわからないもので... shugo> shugo> すみません、fj.comp.parallelでスレッドライブラリではMutexと shugo> ConditionVariableを使うのが一般的だと書いてあったので、そうな shugo> のかと思って説明をしてませんでした。 shugo> # 僕もそれまで知らなかったのですが(^^; shugo> shugo> ConditionVariableはある状態が満たされるまで一時的にロックを解放して shugo> 条件が見たされるまで待機させるためのクラスです。 shugo> ....... shugo> Rubyのはなしと離れそうなのでレスしないでおこうとおもっていたのですが、 shugo> |>今JavaでMutexとConditionVariableを作っているのですが JavaでConditionVariableがいる理由がわからないのですが。 # つくってみたかっただけなのかな :-) Javaのsynchronized宣言/java.lang.object.wait()/java.lang.object.notify() はこのConditionVariableを隠蔽するための機構です(モニターと呼ばれる)。 つまり、 class XXXX extends Thread { public synchronized reader() { while (isEmpty/* 条件が満たされない */) { wait(); } // データを読み込む isEmpty = true; notify(); } public synchronized writer() { while (!isEmpty/* 条件が満たされない */) { wait(); } // データを書き込む isEmpty = false; notify(); } }; は pthread風に書くと (Cが混ざってぐちゃぐちゃだけれど) class XXXX extends Thread { private pthread_mutex_t m; private pthread_cond_t c; public reader() { pthread_mutex_lock(&m); /* synchronized ブロックの始まり */ while (isEmpty/* 条件が満たされない */) { pthread_cond_wait(&c,&m); } // データを読み込む isEmpty = true; pthread_cond_signal(&c); pthread_mutex_unlock(&m); /* synchronized ブロックの終わり */ } ... // 略 }; となって private pthread_mutex_t m; private pthread_cond_t c; を隠蔽していることになっているはずです。 S.Senda