关于Boost共享内存的问题

时间:2012-09-20 00:00:16

标签: c++ boost ipc shared-memory boost-interprocess

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

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

1 个答案:

答案 0 :(得分:1)

  1. 没有那不错的设计。这是使用IPC实现这一目标的标准方法。您(通常)无权访问命名系统,并且拥有一种现有对象列表,如文件系统。
  2. 如果我记得很清楚:如果在映射时截断,则新的无效地址将存在内存违规(如果支持内存保护)。您不必重新映射,只需要关注您正在做的事情。我不确定你是否真的需要截断一个SHM,但那是你的问题。
  3. 这不是问题,它只是意味着底层对象是一个文件,因为SHM的标准语义包括持久性。但是不要在意,那就是提升内部技巧。语义是你想要的,所以用它来获得可移植性!