取消映射提升共享内存

Posted

技术标签:

【中文标题】取消映射提升共享内存【英文标题】:Unmapping boost shared memory 【发布时间】:2015-03-09 08:15:53 【问题描述】:

我有一个代码,其中一个写入者和多个读取者使用了 boost 共享内存。

写入者创建共享内存,以写入权限打开它,并时不时向其中写入数据。

Reader 总是来来去去,每个 Reader 都以 read_only 权限映射到共享内存,做它该做的事情,然后调用 remove。

问题似乎是当读者完成它正在做的事情时。它调用remove,但是remove会删除新读者的shared_memory文件,他们无法映射到它。

我的问题是,一个进程如何从共享内存中分离,而不删除它? boost 库中似乎没有分离功能。

【问题讨论】:

您能否提供更多您正在使用的女巫库的详细信息。那是 boost.interprocess 吗? 确实如此。可能是 Boost Interprocess 或 Boost iostreams #include 【参考方案1】:

您应该能够使用共享引用计数。

实现此目的的共享指针或信号量。

对于 Boost Interprocess,关闭不会删除映射/共享对象。只是不要调用 remove。

【讨论】:

如何关闭?据我所知,没有关闭 API 调用,只删除导致我的问题的原因。一旦我在阅读器客户端中完成映射共享内存,我不希望留下它。 shared_memory_objectmanaged_shared_memorymanaged_mapped_file 超出范围时,它会被关闭。真的就像std::fstream 一样。这是 C++ :) 但是当它关​​闭时是进程级别上未映射的内存,我知道该对象可能会超出范围,但是如果共享内存仍然在有问题的进程中映射 - 以及我试图避免。 好的。那将是资源泄漏,您会将其报告为错误。提示:不,这不会发生。是的:共享记忆会一直存在,直到被删除。不,如果没有您的要求,它不会保持映射

以上是关于取消映射提升共享内存的主要内容,如果未能解决你的问题,请参考以下文章

共享内存之——mmap内存映射

共享内存实现原理

内存映射mmap 和 共享内存

c# 通过内存映射实现文件共享内存

Posix 共享内存与映射文件

mmap()共享内存详解