next up previous
: 有限バッファ問題 : 同期をとる : 同期をとる

セマフォ

上で導入したセマフォをタイムチャートを使って表わすと,図6 のようになる.
図 6: タイムチャート(セマフォ)
\begin{figure}\begin{center}
\epsfile{file=fig3.eps,width=7.5cm,height=4cm}
\end{center}\end{figure}
セマフォと使うと,複数のスレッド間で Wait() Signal() で囲まれ た部分を処理する毎に,切換えられていることがわかる.これは,図 7 に示 すように,2 つのセマフォにより,処理が制御されているためである.
図 7: セマフォ
\begin{figure}\begin{center}
\epsfile{file=fig4.eps,width=6cm,height=3cm}
\end{center}\end{figure}
各セマフォは,2 つの値を持ち,メソッドを実行できるか,できないかを 表わしている.もし,他のスレッドがそのスレッドを実行している時, スレッドは「待たされる」という処理をする.そして,いずれ,処理可能となっ た時,その処理が再開される.このような 2 つの値しか持たないセマフォを 2 値セマフォ(binary semaphore) という. 2 値セマフォは,図ではよく旗で表現する.各スレッドは,その旗を見て 「処理可能かどうか」を判断し,同期をとっている.さらに,その使い方は簡 単でセマフォで用意されたメソッド Wait() Signal() で挟めばよい.

例えば,クラス Consumer のインスタンスでは,

cons.Wait();
System.out.println(""+data.read());
prod.Signal();
としている.
Consumer 用のセマフォ cons のメソッド Wait() を呼出し,「データを読み取る処理」( data.read()) を行って よいかを問い合わせている.許可がおりれば data.read() を処理し, 終了した旨を Producer 用のセマフォ prod のメソッド Signal() を呼出し,知らせている. Producer 用のセマフォにも同様に逆の処理を行えばよい.



平成12年8月9日