プロデューサーと N (N >= 1) ワーカーを持つプログラムを実装しようとしています。これらは、メッセージ キューを使用して通信します。アイデアは、プロデューサーが「タスク」をキューに送信することです。ワーカーは msgrcv() 呼び出しを実行してタスクを取得し、コードを実行します。ワーカーがタスクを完了すると、計算の結果がキューに送信されます。プロデューサーはこのメッセージを受け取り、結果を保存します。
私は POSIX メッセージ キューを使用しており、プロデューサーとワーカーは同時に動作します。
このプログラムの背後にある問題は、通信を危険にさらすシナリオが存在することです。各メッセージのサイズは最大 5000 バイトです。UNIX システムでは、キューの最大サイズは ~16000 バイトです。
シナリオは次のとおりです。キューに 3 つのタスクがあります (5000*3 = 15000 バイト)。一部のワーカーは、キューから 1 つのメッセージを取得します (現在、キューには 10000 バイトあります)。ワーカーはタスクの実行を開始し、ワーカーが各タスクで処理する必要のあるバイト数のために、プロデューサーは別のメッセージをキューに送信します (キューは現在満杯です)。タスクが完了すると、ワーカーは結果をキューに送信しようとし、ブロックされます (キューがいっぱいです)。プロデューサーは別のタスクをキューに送信しようとし、これもブロックされます。
このプログラムを 1 人のワーカーだけで実行すると、このシナリオがかなりの確率で発生します。
この状況を回避するためのアイデアはありますか?