我检查过的boost::interprocess::managed_shared_memory
manual和most other资源总是会显示父进程和由它产生的一堆子进程的示例。
在我的情况下,我有几个由第三方应用程序生成的进程,我只能控制“子”。这意味着我无法拥有一个中心大脑来分配和释放共享内存段。我的所有流程都必须能够这样做(因此,我无法在退出时删除数据)。
我的想法是open_or_create
一个段,并使用此区域中存储的锁(find_or_construct
'ed),我检查一个特定的哈希,看看内存区域是否是由同一个软件创建的版本
如果不是这样,则必须擦除内存段以避免破坏代码。
理想情况下,我希望保留锁定对象,因为可能还有其他进程在等待它。
我认为:
列出所有对象名称并删除除锁定之外的所有对象名称。
使用shared_memory_object::truncate
managed_shared_memory
,我不知道它有多可靠,因为我不确定锁是第一次分配的数据。重新计算流程并擦除最后一个
上的数据使用单独的共享内存区域进行此簿记。
有任何建议或见解吗?
答案 0 :(得分:1)
这听起来像是一个共享所有权"场景。
在这种情况下,您通常会想到的是共享指针:
Interprocess具有专门的共享指针(和ditto make_shared
),用于此目的。
创建共享内存领域可以很快完成"#34;来自每个参与过程(open_or_create
)。请注意,需要同步创建。进一步的段管理器操作通常已经隐式同步:
每当从不同进程访问相同的托管共享内存时,会自动同步创建,查找和销毁对象等操作。如果两个程序尝试在托管共享内存中创建具有不同名称的对象,则相应地序列化访问。要一次执行多个操作而不被来自不同进程的操作中断,请使用成员函数
atomic_func()
(参见Example 33.11)。