如何擦除boost managed_shared_memory的某些内容
How to wipe some contents of boost managed_shared_memory?
boost::interprocess::managed_shared_memory
手册和我检查过的大多数其他资源总是显示存在父进程及其派生的一堆子进程的示例。
在我的例子中,我有几个由第三部分应用程序派生的进程,我只能控制"子进程"。这意味着我不能有一个中央大脑来分配和释放共享的记忆片段。我的所有进程都必须能够做到这一点(因此,我无法在退出时擦除数据)。
我的想法是open_or_create
一个段,并使用存储在该区域中的锁(find_or_construct
'ed),检查某个散列,看看该内存区域是否由同一软件版本创建。
如果不是这样,则必须擦除内存段以避免破坏代码。
理想情况下,我希望保留锁定对象,因为可能有其他进程正在等待它
我认为:
-
列出所有对象名称并删除除锁定之外的所有对象。
- 无法执行此操作,因为对象可能使用不同的实现
- 此外,我找不到在哪里列出这些名字
-
使用
shared_memory_object::truncate
- 我找不到太多关于它的信息
- 通过使用
managed_shared_memory
,我不知道它的可靠性有多高,因为我不确定锁是第一个分配的数据
-
重新计数进程并擦除最后一个上的数据
- 容易出现致命的终止问题
-
使用一个单独的共享内存区域进行记账。
- 听起来很合理,但过分了
有什么建议或见解吗?
这听起来像是一个"共享所有权"场景。
在这种情况下,您通常会想到共享指针:
- http://www.boost.org/doc/libs/1_58_0/doc/html/interprocess/interprocess_smart_ptr.html#interprocess.interprocess_smart_ptr.shared_ptr
Interprocess有专门用于此目的的共享指针(与make_shared
相同)。
创建共享内存领域可以从每个参与进程(open_or_create
)"乐观地"完成。请注意,创建需要同步。进一步的分段管理器操作通常已经隐式同步:
每当从不同的进程访问同一个托管共享内存时,创建、查找和销毁对象等操作都会自动同步。如果两个程序试图在托管共享内存中创建具有不同名称的对象,则访问将相应地序列化。要在不被来自不同进程的操作中断的情况下一次执行多个操作,请使用成员函数
atomic_func()
(参见示例33.11)
- Python ctype 'c_char_p' Memory Leak
- 模式"allocate memory or use existing data"
- 引用 std::shared:ptr 以避免引用计数
- Win32 API - HWND "{unused = ???} Unable to read memory"错误
- "in-situ without memory allocation" 字符串的愚蠢实现意味着什么?
- C++ "Using Uninitialized Memory.. (variable name) "
- "Memory Fragmentation"这仍然是一个问题?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 封送指向结构异常"cannot Read or Write protected memory"的指针数组的指针数组
- 向量数组"Cannot access memory at address"
- 无法使用 libtool 将 -shared 参数传递给 g++
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- 我在 C++ "out_of_range at memory location"有问题
- QML QQmlPropertyList - 包含的对象生存期和'memory rules'
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- Java 本机访问代码错误:"Invalid memory access"
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 编写"anti-lack of memory"异常安全代码
- 什么__asm挥发性("pause" ::: "memory");男孩
- 将 Dr. Memory 与 Visual Studio 项目配合使用时出错:缺少应用程序所需的库