我正在尝试实现一个具有生产者和 N (N >= 1) 工人的程序。他们使用消息队列进行通信。这个想法是生产者向队列发送“任务”。工作人员执行 msgrcv() 调用以获取任务并执行一些代码。在工作人员完成任务后,它会将计算结果发送到队列。生产者将收到此消息并保存结果。
我正在使用 POSIX 消息队列,并且生产者和工作人员同时工作。
该程序背后的问题是存在破坏通信的场景。每条消息的大小约为 5000 字节。在 UNIX 系统中,最大队列大小约为 16000 字节,就是这种情况。
场景是:队列中有3个任务(5000*3 = 15000字节)。一些工作人员从队列中获取一条消息(现在队列有 10000 个字节)。工作人员开始执行任务,并且由于工作人员必须在每个任务中处理的字节数,生产者向队列发送另一条消息(队列现在已满)。现在,任务完成后,工作人员尝试将结果发送到队列并被阻塞(队列已满)。生产者尝试将另一个任务发送到队列并且也被阻塞。
如果我只用一个工人运行这个程序,这种情况很有可能发生。
有没有人有避免这种情况的想法?