Я особенно настойчив в этом, но, похоже, я упускаю важный, базовый момент или что-то еще, поскольку то, что я хочу сделать, должно быть общим:
Мне нужно создать объект кольцевого буфера фиксированного размера из процесса менеджера (Process M
). Этот объект имеет write()
и read()
методы для записи / чтения из буфера. Методы чтения / записи будут вызываться независимыми процессами (Process R
и W
)
Я реализовал буфер, SharedBuffer<T&>
, он распределяет слоты буфера в SHM с помощью boost :: interprocess и отлично работает в рамках одного процесса . Я прочитал ответы на этот вопрос и этот на SO, а также спросил мой собственный , но я все еще в неведении о том, как иметь разные процессы доступа к методам из общего объекта. В Boost doc есть пример создания вектора в SHM , который очень похож на то, что я хочу, но я хочу создать свой собственный класс.
Мои текущие параметры:
- Используйте размещение
new
, как предложено Чарльзом Б. для моего вопроса ; однако он предупреждает, что не стоит помещать объекты не POD в SHM. Но моему классу нужны методы чтения / записи, как я могу их обработать?
- Добавить распределитель в определение моего класса, например, иметь
SharedBuffer<T&, Alloc>
и действовать аналогично примеру вектора , приведенному в boost. Это звучит действительно сложно.
- Измените
SharedBuffer
на класс POD, то есть избавьтесь от всех методов. Но тогда как синхронизировать чтение и запись между процессами?
Что мне не хватает? Кольцевые буферы фиксированной длины очень распространены, поэтому либо у этой проблемы есть решение, либо я делаю что-то не так.