信号量を使って生産者-消費者の問題を実現します.


問題の説明:緩衝区を使って物品を保存します.緩衝区が満杯でない限り、生産者は物品を入れることができます.バッファだけが空いていないので、消費者は荷物を持っていくことができます.
バッファ領域は臨界リソースであるため、バッファ領域への相互反発アクセスを制御するために、相互反発量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);
    }
}