在共享内存POSIX中创建队列

时间:2011-04-11 09:53:59

标签: c posix mmap

对于我的实现,我使用mmap为进程间通信分配共享内存。在这个共享内存中,我初始化一个队列(我将第一个和最后一个指针设置为NULL)。

问题是如何将新项目推入队列。通常我会使用malloc来分配我的'队列项结构',然后指向它,但我不能使用它,是吗?我需要以某种方式在共享内存中分配它。我可能可以使用另一个mmap并将项目推到那里,然后指向它,但它似乎不正确,因为我必须多次这样做。

这可以简单地完成,还是我应该考虑不同的解决方案?

感谢任何想法。

1 个答案:

答案 0 :(得分:2)

在共享内存中创建队列的一般规则:

1)永远不要将指针用作共享元素,因为操作系统可能会在不同的进程中选择不同的虚拟地址。始终使用共享内存视图基址或数组索引的偏移量,或者任何与位置无关的内容。

2)您必须手动分区共享内存。例如。您必须知道您的队列可能包含多少项,并确定共享区域的大小,以便它可以包含“haeder”(插入索引和提取索引...)和项目数组。定义一个包含正确大小的“header”和“item array”的结构通常就足够了:内存大小是sizeof(your_structure),它的地址是mmap返回的地址。

3)仔细考虑多线程和多处理问题。如果访问线程可能阻塞,则使用互斥锁保护对共享内存的访问。但是,如果要创建“非阻塞”队列,则必须至少使用原子操作来更改相关字段,并考虑任何可能的时序问题。

此致