Создание очереди в общей памяти POSIX - PullRequest
1 голос
/ 11 апреля 2011

Для моей реализации я использую mmap для выделения разделяемой памяти для межпроцессного взаимодействия.В этой общей памяти я инициализирую очередь (я устанавливаю первый и последний указатель в NULL).

Проблема в том, как вставить новый элемент в очередь.Обычно я использовал бы malloc, чтобы выделить свою «структуру элемента очереди», а затем указать на нее, но я не могу это использовать, не так ли?Мне нужно как-то выделить его в разделяемой памяти.Я, вероятно, мог бы использовать другой mmap и нажать на элемент там, а затем указать на него, но это кажется неправильным, потому что мне пришлось бы делать это несколько раз.

Можно ли сделать это просто, или ястоит подумать о разных решениях?

Спасибо за любые идеи.

1 Ответ

2 голосов
/ 11 апреля 2011

Общие правила для создания очереди в общей памяти:

1) Никогда не используйте указатели в качестве общих элементов, поскольку ОС может выбирать разные виртуальные адреса в разных процессах.Всегда используйте смещения из базового адреса представления совместно используемой памяти, или индексов массива, или в любом случае чего-то, что не зависит от позиции.

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

3) Тщательно продумайте вопросы многопоточности и многопроцессорности.Защитите доступ к общей памяти с помощью мьютекса, если допустимо, что доступ к потокам может блокироваться.Но если вы хотите создать «неблокирующую» очередь, вы должны по крайней мере использовать атомарные операции для изменения соответствующих полей и рассмотреть любую возможную проблему синхронизации.

С уважением

...