Общие правила для создания очереди в общей памяти:
1) Никогда не используйте указатели в качестве общих элементов, поскольку ОС может выбирать разные виртуальные адреса в разных процессах.Всегда используйте смещения из базового адреса представления совместно используемой памяти, или индексов массива, или в любом случае чего-то, что не зависит от позиции.
2) Вы должны вручную разделить разделяемую память.Например, вы должны знать, сколько элементов может содержать ваша очередь, и измерить общую область, чтобы она могла содержать «хедер» (индекс вставки и индекс извлечения ...) и массив элементов.Часто достаточно определить структуру, которая содержит как «заголовок», так и «массив элементов» правильного размера: размер памяти равен sizeof (your_structure), а адрес - это адрес, возвращаемый mmap.
3) Тщательно продумайте вопросы многопоточности и многопроцессорности.Защитите доступ к общей памяти с помощью мьютекса, если допустимо, что доступ к потокам может блокироваться.Но если вы хотите создать «неблокирующую» очередь, вы должны по крайней мере использовать атомарные операции для изменения соответствующих полей и рассмотреть любую возможную проблему синхронизации.
С уважением