Вы на правильном пути.
Блокировка свободного обмена фиксированными сообщениями между потоками / процессами / процессорами
фиксированный размер кольцевые буферы могут использоваться для беспрепятственной связи между потоками, процессами или процессорами, если есть один производитель и один потребитель.Некоторые проверки для выполнения:
переменная head записывается только производителем (как атомарное действие после записи)
tail переменная записывается толькопотребитель (как элементарное действие после чтения)
Подводный камень: введение переменной размера или флага заполнения / пустого буфера;они, как правило, пишутся как производителем, так и потребителем, и, следовательно, могут вызвать проблемы.
Я обычно использую кольцевые буферы для этой цели.Самый важный урок, который я усвоил, состоит в том, что кольцевой буфер не может содержать больше элементов.Таким образом, переменные head и tail записываются производителем и потребителем.
Расширение для блоков большого / переменного размера Чтобы использовать буферы в среде реального времени, вы можете использовать пулы памяти (часто доступные в оптимизированном виде в операционных системах реального времени) или отделить выделение отиспользование.Последнее, как мне кажется, подходит к этому вопросу.
Если вам нужно обмениваться большими блоками, я предлагаю использовать пул с буферными блоками и общатьсяуказатели на буферы, использующие очередь.Так что используйте третью очередь с указателями буфера.Таким образом, распределение может быть выполнено в приложении (в фоновом режиме), и ваша часть в реальном времени имеет доступ к переменному объему памяти.
Приложение
while (blockQueue.full != true)
{
buf = allocate block of memory from heap or buffer pool
msg = { .... , buf };
blockQueue.Put(msg)
}
Producer:
pBuf = blockQueue.Get()
pQueue.Put()
Consumer
if (pQueue.Empty == false)
{
msg=pQueue.Get()
// use info in msg, with buf pointer
// optionally indicate that buf is no longer used
}