Boost managed_shared_memory的open_or_create是否需进程间同步?
Boost托管共享内存
open_or_create的进程安全性问题 我有两个进程P1和P2,使用boost::interprocess::managed_shared_memory实现IPC,二者均采用以下代码片段:
namespace ipc = boost::interprocess; // 打开指定名称和大小的共享内存段 ipc::managed_shared_memory segment_(ipc::open_or_create, "shared_memory_segment", 1024); // 立即调用find_or_construct创建对象 auto heartbeat_p1 = segment_.find_or_construct<std::atomic<int64_t>>("heartbeat_p1")(0); // .. 其他共享对象 // 后续使用这些对象
我认为此处open_or_create的用法并非进程安全,是否需要外部同步?
可能的问题场景
场景1:同时调用create()的竞态风险
注:此情况不会引入竞态条件,open()内部属于OS系统调用,由操作系统处理(类似open系统调用),此处列出仅为保证问题完整性。
当P1和P2同时进入segment_的构造函数时,open_or_create的逻辑可近似表示为:
try { create(); } catch { if (already_exists_error){ try { open(); } } else { throw(); } }
二者同时尝试create()是否会引发竞态条件?
场景2:未完全初始化的内存段被提前打开
若P1处于创建共享内存段的过程中,但尚未完成托管内存段正常运行所需的数据结构创建,此时P2启动并直接打开、附加到该未完全创建的内存段,是否会导致P2的共享内存对象处于未定义状态?
实际异常现象
我遇到了异常情况:Boost托管共享内存中的对象无法跨进程共享,但未抛出任何异常。
核心疑问
我的理解是否正确:在两个不同进程中使用open_or_create需要外部同步?若是,应如何正确同步以让二者均可使用open_or_create?
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

