gpt4 book ai didi

c++ - 如何删除 boost managed_shared_memory 的一些内容?

转载 作者:行者123 更新时间:2023-11-30 05:41:39 26 4
gpt4 key购买 nike

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. 使用单独的共享内存区域来记录。

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

有什么建议或见解吗?

最佳答案

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

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

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

可以从每个参与进程 (open_or_create) 中“乐观地”完成创建共享内存领域。注意创建需要同步。进一步的段管理器操作通常已经隐式同步:

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

关于c++ - 如何删除 boost managed_shared_memory 的一些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31085327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com