如何擦除 boost managed_shared_memory 的一些内容?

How to wipe some contents of boost managed_shared_memory?

我检查的 boost::interprocess::managed_shared_memory manual and most other 资源总是显示有父进程和由它产生的一堆子进程的示例。

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

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

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

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

我想的事情:

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

    • 这无法完成,因为对象可能使用不同的实现
    • 我也找不到在哪里列出名字。
  2. 使用shared_memory_object::truncate

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

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

    • 听起来很合理,但有点矫枉过正?

有什么建议或见解吗?

这听起来像是 "shared ownership" 场景。

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

Interprocess 有专门用于此目的的共享指针(和同上 make_shared)。

可以从每个参与进程 (open_or_create) "optimistically" 创建共享内存领域。注意创建需要同步。更多的段管理器操作通常已经隐式同步:

Whenever the same managed shared memory is accessed from different processes, operations such as creating, finding, and destroying objects are automatically synchronized. If two programs try to create objects with different names in the managed shared memory, the access is serialized accordingly. To execute multiple operations at one time without being interrupted by operations from a different process, use the member function atomic_func() (see Example 33.11).