我正在使用boost :: interprocess通过托管共享内存在进程之间共享数据。客户端可以读取或写入共享内存。
客户端首先尝试打开现有的共享内存:
managed_shared_memory(open_only, "MySharedMemory");
如果打开失败,则会创建内存:
managed_shared_memory(create_only, "MySharedMemory");
打开或创建共享内存后,客户端会增加客户端计数(存储在共享内存中的整数)。
当调用客户端的析构函数时,客户端计数会减少。如果客户端计数== 0,则删除共享内存:
shared_memory_object::remove("MySharedMemory");
到目前为止一切顺利。但是,如果进程崩溃,则无法减少客户端计数,因此无法正确删除内存。
此时,新客户端可以成功打开共享内存,无论处于何种状态而不是新的默认状态。这是有问题的。
所以我的问题是。管理共享内存生命周期的最佳方法是什么?
不崩溃是一个好主意,但我正在一个插件环境中工作,我无法控制的东西可以将一切都放下来,客户端不断进出。
另一个想法是使用管道或套接字来验证客户端是否仍然有效(例如,在打开内存时ping它们,如果没有响应则手动清理)但这感觉有点过分。