You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:38:14