如何擦除boost managed_shared_memory的某些内容

How to wipe some contents of boost managed_shared_memory?

本文关键字:memory shared managed 何擦除 擦除 boost      更新时间:2023-10-16

boost::interprocess::managed_shared_memory手册和我检查过的大多数其他资源总是显示存在父进程及其派生的一堆子进程的示例。

在我的例子中,我有几个由第三部分应用程序派生的进程,我只能控制"子进程"。这意味着我不能有一个中央大脑来分配和释放共享的记忆片段。我的所有进程都必须能够做到这一点(因此,我无法在退出时擦除数据)。

我的想法是open_or_create一个段,并使用存储在该区域中的锁(find_or_construct'ed),检查某个散列,看看该内存区域是否由同一软件版本创建。

如果不是这样,则必须擦除内存段以避免破坏代码。

理想情况下,我希望保留锁定对象,因为可能有其他进程正在等待它

我认为:

  1. 列出所有对象名称并删除除锁定之外的所有对象。

    • 无法执行此操作,因为对象可能使用不同的实现
    • 此外,我找不到在哪里列出这些名字
  2. 使用shared_memory_object::truncate

    • 我找不到太多关于它的信息
    • 通过使用managed_shared_memory,我不知道它的可靠性有多高,因为我不确定锁是第一个分配的数据
  3. 重新计数进程并擦除最后一个上的数据

    • 容易出现致命的终止问题
  4. 使用一个单独的共享内存区域进行记账。

    • 听起来很合理,但过分了

有什么建议或见解吗?

这听起来像是一个"共享所有权"场景。

在这种情况下,您通常会想到共享指针

  • 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)