Я пытаюсь реализовать программу, в которой есть продюсер и N (N> = 1) работников.Они общаются, используя очередь сообщений.По идее, продюсер отправляет в очередь «задания».Рабочие выполняют вызов msgrcv (), чтобы получить задачу и выполнить некоторый код.После того, как работник выполнит задачу, он отправит в очередь результат вычисления.Производитель получит это сообщение и сохранит результаты.
Я использую очереди сообщений POSIX, а производитель и рабочие работают одновременно.
Проблема этой программы заключается в том, что существует сценарий, которыйставит под угрозу общение.Каждое сообщение имеет размер ~ 5000 байт.Максимальный размер очереди составляет ~ 16000 байт в системах UNIX, что имеет место.
Сценарий: в очереди 3 задачи (5000 * 3 = 15000 байт).Некоторые работники получают одно сообщение из очереди (теперь очередь имеет 10000 байт).Рабочий начинает выполнение задачи, и из-за количества байтов, которое рабочий должен обработать в каждой задаче, производитель отправляет в очередь другое сообщение (очередь теперь заполнена).Теперь, после выполнения задачи, работник пытается отправить результат в очередь и блокируется (очередь заполнена).Производитель пытается отправить еще одно задание в очередь и тоже блокируется.
Если я запускаю эту программу только с одним работником, вероятность этого сценария может быть значительной.
Есть ли у кого-нибудь идеи?чтобы избежать этой ситуации?