3

我正在尝试实现一个具有生产者和 N (N >= 1) 工人的程序。他们使用消息队列进行通信。这个想法是生产者向队列发送“任务”。工作人员执行 msgrcv() 调用以获取任务并执行一些代码。在工作人员完成任务后,它会将计算结果发送到队列。生产者将收到此消息并保存结果。

我正在使用 POSIX 消息队列,并且生产者和工作人员同时工作。

该程序背后的问题是存在破坏通信的场景。每条消息的大小约为 5000 字节。在 UNIX 系统中,最大队列大小约为 16000 字节,就是这种情况。

场景是:队列中有3个任务(5000*3 = 15000字节)。一些工作人员从队列中获取一条消息(现在队列有 10000 个字节)。工作人员开始执行任务,并且由于工作人员必须在每个任务中处理的字节数,生产者向队列发送另一条消息(队列现在已满)。现在,任务完成后,工作人员尝试将结果发送到队列并被阻塞(队列已满)。生产者尝试将另一个任务发送到队列并且也被阻塞。

如果我只用一个工人运行这个程序,这种情况很有可能发生。

有没有人有避免这种情况的想法?

4

2 回答 2

1

如果您无法更改队列大小、要使用的队列数量或使用不同的队列 API,那么队列更少的数据会怎样?

您可以将实际数据放在共享内存对象或临时文件中。然后,不是将数据放入消息中,而是将文件名或共享内存对象名称以及可能的偏移量放入消息中。生产者进程在收到结果后可以对其进行清理。

它不一定是共享内存或临时文件,但想法是将数据放在消息中以外的位置,并在消息中包含其他进程访问它所需的任何信息。

于 2011-11-21T00:10:42.053 回答
0

我要么为客户端使用第二个消息队列 - > 服务器响应,要么将 (#sent - #received) 限制为安全数字。

于 2011-11-20T23:23:43.163 回答