3

我正在尝试提出一种简单但可移植的方式来使用共享内存。Boost::interprocess似乎是一个不错的起点,但我遇到了一些问题/担忧。

  1. 我可以以某种方式查询 shm 段的存在吗,最好使用 boost API?我总是可以尝试使用create_only并捕获异常来创建它,但这是一个糟糕的设计,我不希望堆栈在“好”路径中展开。
  2. 即使附加了其他进程,我也可以截断该段吗?(当然,前提是我会处理同步)我想所有其他进程都必须重新映射,它们是否也必须重新连接?
  3. Boost doc说,在Windows上,便携式shared_memory_object实际上并不是共享内存本身,而是一个内存映射文件。我理解正确吗?这意味着我必须在 Windows 上使用专门的代码,这是我试图避免的。让我质疑 Boost 是否适合我的目的,还有其他选择吗?与其与 boost 作斗争,我还不如自己编写特定于平台的代码——在您看来,这值得付出努力吗?
4

1 回答 1

1
  1. 不,这不是糟糕的设计。这是使用 IPC 执行此操作的标准方法。您(通常)无权访问命名系统,并且拥有诸如文件系统之类的现有对象列表。
  2. 如果我没记错的话:如果你在映射时截断,新的无效地址会出现内存冲突(如果支持内存保护)。你不必重新映射,你只需要关心你在做什么。我不确定您是否真的需要截断 SHM,但这是您的问题。
  3. 这不是问题,它只是意味着底层对象是一个文件,因为 SHM 的标准语义包括持久性。但不要在意,那是提升内部技巧。语义是你想要的,所以用它来获得可移植性!
于 2013-07-16T21:07:16.663 回答