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

时间:2015-06-27 05:00:19

标签: c++ boost shared-memory interprocess

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

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

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

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

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

我认为:

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

    • 由于对象可能使用不同的实现
    • ,因此无法完成此操作
    • 此外,我找不到列出姓名的位置。
  2. 使用shared_memory_object::truncate

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

    上的数据
    • 容易发生致命的终止问题。
  4. 使用单独的共享内存区域进行此簿记。

    • 听起来很合理,但是过度杀伤?
  5. 有任何建议或见解吗?

1 个答案:

答案 0 :(得分:1)

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

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

Interprocess具有专门的共享指针(和ditto make_shared),用于此目的。

创建共享内存领域可以很快完成"#34;来自每个参与过程(open_or_create)。请注意,需要同步创建。进一步的段管理器操作通常已经隐式同步:

  

每当从不同进程访问相同的托管共享内存时,会自动同步创建,查找和销毁对象等操作。如果两个程序尝试在托管共享内存中创建具有不同名称的对象,则相应地序列化访问。要一次执行多个操作而不被来自不同进程的操作中断,请使用成员函数atomic_func()(参见Example 33.11)。