Почему создание кольцевого буфера совместно используется разными процессами (в C ++), что я делаю неправильно? - PullRequest
3 голосов
/ 11 марта 2010

Я особенно настойчив в этом, но, похоже, я упускаю важный, базовый момент или что-то еще, поскольку то, что я хочу сделать, должно быть общим:

Мне нужно создать объект кольцевого буфера фиксированного размера из процесса менеджера (Process M). Этот объект имеет write() и read() методы для записи / чтения из буфера. Методы чтения / записи будут вызываться независимыми процессами (Process R и W)

Я реализовал буфер, SharedBuffer<T&>, он распределяет слоты буфера в SHM с помощью boost :: interprocess и отлично работает в рамках одного процесса . Я прочитал ответы на этот вопрос и этот на SO, а также спросил мой собственный , но я все еще в неведении о том, как иметь разные процессы доступа к методам из общего объекта. В Boost doc есть пример создания вектора в SHM , который очень похож на то, что я хочу, но я хочу создать свой собственный класс.

Мои текущие параметры:

  1. Используйте размещение new, как предложено Чарльзом Б. для моего вопроса ; однако он предупреждает, что не стоит помещать объекты не POD в SHM. Но моему классу нужны методы чтения / записи, как я могу их обработать?
  2. Добавить распределитель в определение моего класса, например, иметь SharedBuffer<T&, Alloc> и действовать аналогично примеру вектора , приведенному в boost. Это звучит действительно сложно.
  3. Измените SharedBuffer на класс POD, то есть избавьтесь от всех методов. Но тогда как синхронизировать чтение и запись между процессами?

Что мне не хватает? Кольцевые буферы фиксированной длины очень распространены, поэтому либо у этой проблемы есть решение, либо я делаю что-то не так.

1 Ответ

1 голос
/ 11 марта 2010

Кольцевой буфер не является проблемой здесь, с использованием общей памяти. Решение этой проблемы заключается в использовании нового размещения для размещения вашего объекта или, по крайней мере, для выделения его внутреннего буфера. Простые функции-члены, конструкторы и деструкторы не должны вызывать проблем, но убедитесь, что вы не используете виртуальные функции или не используете объекты, отличные от POD, так как это может быть сложно.

...