4

我对此特别密集,但似乎我错过了一个重要的基本点或其他东西,因为我想做的事情应该是常见的:

我需要从管理器进程 ( Process M) 创建一个固定大小的环形缓冲区对象。该对象具有从缓冲区写入/读取的方法write()read()读/写方法将由独立进程(Process RW)调用

我已经实现了缓冲区,SharedBuffer<T&>它使用 boost::interprocess 在 SHM 中分配缓冲区插槽,并在单个进程中完美运行。我已经阅读了这个问题的答案以及关于 SO 的答案以及我自己的问题,但我仍然对如何从一个公共对象有不同的进程访问方法一无所知。Boost 文档有一个在 SHM 中创建向量的示例,这与我想要的非常相似,但我想实例化我自己的类。

我目前的选择是:

  1. new正如 Charles B. 对我的问题所建议的那样,使用放置位置;但是,他警告说,将非 POD 对象放在 SHM 中并不是一个好主意。但是我的班级需要读/写方法,我该如何处理?
  2. 在我的类定义中添加一个分配器,例如,拥有SharedBuffer<T&, Alloc>并继续类似于boost 中给出的向量示例。这听起来真的很复杂。
  3. 更改SharedBuffer为 POD 类,即去掉所有方法。但是那么如何在进程之间同步读写呢?

我错过了什么?固定长度的环形缓冲区很常见,所以要么这个问题有解决方案,要么我做错了什么。

4

1 回答 1

1

环形缓冲区在这里不是问题,使用共享内存是。解决方案是使用placement new 来分配您的对象,或者至少用于分配它的内部缓冲区。简单地拥有成员函数、构造函数和析构函数应该不会造成麻烦,但请确保您不使用虚函数或包含非 POD 对象,因为这可能会变得很棘手。

于 2010-03-11T20:41:11.620 回答