c - 在进程之间同步消息队列

标签 c unix concurrency message-queue sysv-ipc

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

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

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

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

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

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

最佳答案

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

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

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

关于c - 在进程之间同步消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8205557/

相关文章:

java - 什么 Java 数据结构/解决方案最适合这些要求?

c++ - 如何从 CreateWindowEx() 窗口获取宽度和高度? C++

在C中将int转换为ASCII字符

linux - 文件名操作

c++ - 如何使用 intel tbb 并发无序映射

java - 连续运行ExecutorService任务

c - fopen() 在 c 中第二次使用时崩溃

使用gcc使用c语言更改gtk中按钮的颜色

c - 了解来自多个进程的并发文件写入

R 基准代码不生成输出