コンシューマのみがブロックされる単一のプロデューサと単一のコンシューマでバッファを実装したいと考えています。ここで重要な点は、キューがいっぱいになるとプロデューサが更新を削除できることです。コンシューマのみをブロックする単一のプロデューサ/コンシューマ循環バッファ
私は待ち時間のない実装の変換を検討しましたが、一見して、消費者に通知を失うことなく新しいデータが到着したことを通知する簡単な方法はないようです。
Object ar[SIZE];
int head = 0, tail = 0;
sem_t semItems; // initialized to 0
void enqueue(Object o) {
int val;
sem_getvalue(&semItems, &val);
if (val < SIZE - 1) {
ar[head] = o;
head = (head + 1) % SIZE;
sem_post(&semItems);
}
else {
// dropped
}
}
Object dequeue(void) {
sem_wait(&semItems);
Object o = ar[tail];
tail = (tail + 1) % SIZE;
return o;
}
は、このコードのいずれかの安全性の問題があります。だから私は(いくつかのエラー処理の詳細については、明確にするために省略)カウンティングセマフォを使用して、以下の非常に単純なアプローチに定住しましたか?私は普及した文献のどこにでもそのような実装を見ないことに驚いた。もう1つの疑問は、
sem_post()
がブロックするかどうかです(linuxでは
futex_wake()
を呼び出します)。簡単なソリューションももちろん歓迎します。
編集:リーダーとライターの間にスペースを残して編集したコードです(Mayurkの回答を参照)。
なぜ消費者のみをブロックする必要があるのですか? –
@SumitGemini多くのトラフィックがある場合、プロデューサはハードウェアと話すので、消費者はプロデューサよりも遅く実行する必要があります。これは私が見ているアプローチの1つに過ぎません。暗黙のCASループが実際にそれを悪化させる可能性があります。 – wds
@SumitGeminiはネイティブのC++セマフォの提案に直面しました。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2043.html#SemaphoreTypes – wds