バッファとは,以下のように「ある値」を要素に持つ箱の集まりである. 元々の意味は,緩衝装置の意味で,コンピュータでの装置 (デバイス,device) 間での通信においてデータの流れを調節する場合に用 いられる.
有限バッファには,入力ポインタ(input pointer)と, 出力ポインタ(output pointer) があり, 各々データをバッファに入れる位置と,バッファから出す 位置を示す.また,各ポインタにはセマフォを付随させる(2 個のセマフォを 生成). これらのセマフォは 2 値セマフォと違い整数値を保持するものとする.各々,では,例題として以下のプログラムを見てみよう.
public class BBuffer {
int values[] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
int inputp=0; int outputp=0;
Semaphore isem; Semaphore osem;
BBuffer() {
isem = new Semaphore(10);
osem = new Semaphore(0);
}
public void input(int i) {
isem.Wait();
values[inputp]=i;
inputp=(++inputp)%10;
osem.Signal();
}
public int output() {
osem.Wait();
int r=values[outputp];
outputp=(++outputp)%10;
isem.Signal();
return r;
}
public static void main(String args[])
{
BBuffer bbuffer=new BBuffer();
Producer p = new Producer(bbuffer);
Consumer c = new Consumer(bbuffer);
p.start(); c.start();
}
}
class Producer extends Thread {
BBuffer bbuffer;
Producer(BBuffer bbuffer) {
this.bbuffer=bbuffer;
}
public void run() {
for(int i=0; i<100; i++) {
System.out.println("input="+i);
bbuffer.input(i);
}
}
}
class Consumer extends Thread {
BBuffer bbuffer;
Consumer(BBuffer bbuffer) {
this.bbuffer=bbuffer;
}
public void run() {
for(int i=0; i<100; i++) {
System.out.println("output="+
bbuffer.output());
}
}
}
クラス BBuffer のインスタンスにより有限バッファを表現している. バッファに値を入力する場合は input メソッドを使い, バッファから値を出力する場合は output メソッドを使う. 各々バッファへ入力するオブジェクトとして クラス Producer のインスタンスを定義し, バッファから出力するオブジェクトとしてクラス Consumer のインスタンスを定義する. 両オブジェクトはスレッドとして起動される. バッファは有限の大きさ (ここでは 10) しか持っていないので バッファの最後にポインタが来たら,最初にポインタを進める操作も必要であ
る.そのため,
inputp=(++inputp)%10;
このプログラムを実行すると以下のようになる.
input=0 input=1 input=2 output=0 output=1 output=2 input=3 input=4 input=5 input=6 input=7 input=8 input=9 output=3 output=4 output=5 output=6 input=10 input=11 input=12 input=13 . . .最初,クラス Producer のインスタンスにより input メソッドが呼出 され,3 つの値 (1と2,3) が入力される.その後, クラス Consumer のインスタンスに処理が移り,入力された値が取り出 されていることがわかる.再び クラス Consumer のインスタンスに処 理が移りバッファに値が入力されている.
結果として,0 から 99 の値がバッファへ入力され, 更にバッファから取り出されていることが確認できるが, その間も有限の個数しか持たない (10 個) バッファをうまく利用して待ち合 わせ処理が行われている.