3コンシューマ2プロデューサ。 1つのバッファへの読み書き。 プロデューサAは1要素をバッファ(長さN)にプッシュし、プロデューサBは2要素をバッファにプッシュしています。アクティブ待ちなし。 System Vセマフォを使用することはできません。生産者Aのためのプロデューサ - 2要素を作成するコンシューマプロデューサPOSIXセマフォ
サンプルコード:彼らは読み取りまたは消費以外
void producerA(){
while(1){
sem_wait(full);
sem_wait(mutex);
Data * newData = (Data*) malloc(sizeof(Data));
newData->val = generateRandomletter();
newData->A = false;
newData->B = false;
newData->C = false;
*((Data*) mem+tail) = *newData;
++elements;
tail = (tail + 1) % N;
sem_post(mutex);
sem_post(empty);
}
}
消費者は同じように見えるが、それは無関係です。 私はもちろん、私は、私はまた、2つ以上の空きがある最初の時間を引き上げたことになる生産者Bのための異なるセマフォを持ってみました
sem_wait(full); sem_wait(full);
のようなものを行うことはできませんプロデューサーBで多くの問題が生じていますバッファ内のスポット。しかし、セマフォーを適切に低くして大きくする必要があるので、これはうまくいかなかったfull
とempty
。
この問題をどのように解決できますか?
条件変数は、私が必要とするテクニックであるように見えます。 –
私はプロセス中でアクティブな待ちをすることができないので、ループの繰り返しごとに条件をチェックすることはできません。よりスマートなものがあれば、私はそれを感謝するでしょう。 – Aaroneiros
条件変数の全ポイントは、アクティブ待ちを避けることです。 –