信号量を使って生産者-消費者の問題を実現します.
1177 ワード
問題の説明:緩衝区を使って物品を保存します.緩衝区が満杯でない限り、生産者は物品を入れることができます.バッファだけが空いていないので、消費者は荷物を持っていくことができます.
バッファ領域は臨界リソースであるため、バッファ領域への相互反発アクセスを制御するために、相互反発量mutexを使用する必要がある.
生産者と消費者の行動を同期させるためには、バッファ内の物品の数を記録する必要があります.数量は信号量を使って統計することができます.ここでは2つの信号量が必要です.emptyは空バッファの数を記録し、フルバッファの数を記録します.その中で、empty信号量は生産者の過程で使われます.emptyが0でない場合、生産者は物品を入れることができます.フル信号量は消費者のプロセスで使用され、フル信号量が0でない場合、消費者は商品を取り出すことができます.
注意、バッファをロックしてから信号量をテストしてはいけません.つまり、まずダウンを実行してからダウンを実行してはいけません.このようにすれば、生産者がバッファにロックをかけた後、ダウン(empty)操作を行い、empty=0を発見し、生産者が眠りにつく場合があります.消費者は臨界エリアに入ることができません.生産者がバッファエリアにロックをかけたため、消費者はup操作を実行できなくなり、emptyは永遠に0です.生産者がいつまでも待っています.ロックが解除されません.消費者も永遠に待ち続けます.
バッファ領域は臨界リソースであるため、バッファ領域への相互反発アクセスを制御するために、相互反発量mutexを使用する必要がある.
生産者と消費者の行動を同期させるためには、バッファ内の物品の数を記録する必要があります.数量は信号量を使って統計することができます.ここでは2つの信号量が必要です.emptyは空バッファの数を記録し、フルバッファの数を記録します.その中で、empty信号量は生産者の過程で使われます.emptyが0でない場合、生産者は物品を入れることができます.フル信号量は消費者のプロセスで使用され、フル信号量が0でない場合、消費者は商品を取り出すことができます.
注意、バッファをロックしてから信号量をテストしてはいけません.つまり、まずダウンを実行してからダウンを実行してはいけません.このようにすれば、生産者がバッファにロックをかけた後、ダウン(empty)操作を行い、empty=0を発見し、生産者が眠りにつく場合があります.消費者は臨界エリアに入ることができません.生産者がバッファエリアにロックをかけたため、消費者はup操作を実行できなくなり、emptyは永遠に0です.生産者がいつまでも待っています.ロックが解除されません.消費者も永遠に待ち続けます.
#define N 100
typedef int semaphore;
semaphore mutex = 1;
semaphore empty = N;
semaphore full = 0;
void producer() {
while(TRUE) {
int item = produce_item();
down(&empty);
down(&mutex);
insert_item(item);
up(&mutex);
up(&full);
}
}
void consumer() {
while(TRUE) {
down(&full);
down(&mutex);
int item = remove_item();
consume_item(item);
up(&mutex);
up(&empty);
}
}