生産者と消費者の問題の古典的なアルゴリズムについて私が理解していないこと (ウィキペディアから:)
セマフォミューテックス = 1 セマフォのfillCount = 0 セマフォ emptyCount = BUFFER_SIZE 手続きプロデューサー() { while (真) { item = ProduceItem() down(emptyCount) ダウン (ミューテックス) putItemIntoBuffer(アイテム) アップ (ミューテックス) up(fillCount) } up(fillCount) //消費者は生産者の前に終了しない可能性があります。 } 手続き消費者() { while (真) { down(fillCount) ダウン (ミューテックス) item = removeItemFromBuffer() アップ (ミューテックス) アップ (emptyCount) 消費アイテム(アイテム) } }
プロデューサーとコンシューマーの両方が、バッファーをいじる前に「ミューテックス」をロックし、その後ロックを解除することに注意してください。その場合、つまり、任意の時点で単一のスレッドのみがバッファーにアクセスしている場合、上記のアルゴリズムが、保護ミューテックスをバッファーに配置するだけの単純なソリューションとどのように異なるかはわかりません。
セマフォミューテックス = 1 手続きプロデューサー() { while (真) { item = ProduceItem() フラグ = 真 while (フラグ) { ダウン (ミューテックス) if (bufferNotFull()) { putItemIntoBuffer(アイテム) フラグ = false } アップ (ミューテックス) } } } 手続き消費者() { while (真) { フラグ = 真 while (フラグ) { ダウン (ミューテックス) if (bufferNotEmpty()) { item = removeItemFromBuffer() フラグ = false } アップ (ミューテックス) } 消費アイテム(アイテム) } }
「fillCount」および「emptyCount」セマフォを使用する必要があると私が考えることができる唯一のものは、スケジューリングです。
おそらく最初のアルゴリズムは、5 つのコンシューマーが空のバッファー (ゼロ 'fillCount') で待機している状態で、新しいプロデューサーが登場したときに、その "down(emptyCount)" を通過することを保証するためのものです。ステートメントをすばやく実行し、「ミューテックス」をすばやく取得します。
(一方、他のソリューションでは、新しいプロデューサーがそれを取得してアイテムを挿入するまで、消費者は不必要に「ミューテックス」を取得して放棄するだけです)。
私は正しいですか?何か不足していますか?