: 有限バッファ問題 : 同期をとる : 同期をとる
上で導入したセマフォをタイムチャートを使って表わすと,図6 のようになる.
図 6: タイムチャート(セマフォ)
|
セマフォと使うと,複数のスレッド間で Wait(), Signal() で囲まれ た部分を処理する毎に,切換えられていることがわかる.これは,図 7 に示 すように,2 つのセマフォにより,処理が制御されているためである.
図 7: セマフォ
|
各セマフォは,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日