Доступ к объекту в межпроцессной общей памяти без нарушения строгих правил наложения имен - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть несколько программ, написанных на C ++ 17, работающих на Linux.

Одна программа создает файл в / dev / shm / и отображает его в пространство памяти. Затем он переходит к использованию place-new для инициализации объекта POD в общей памяти.

Другие процессы откроются и отобразят эти файлы в свои области памяти для доступа к объекту. В настоящее время я использую приведение в стиле C, которое работает, но я считаю, что это технически неопределенное поведение в соответствии с правилами псевдонимов C ++, поэтому это может нарушиться в будущей версии GCC.

Компилятор не подозревает, что объект находится в этом месте памяти. Обычно я передаю это компилятору, вызывая place-new, но в этом случае это инициализирует существующий объект (который, я считаю, также будет неопределенным поведением).

Как мне получить доступ к этому объекту, не нарушая строгих правил наложения имен? Это вариант использования для std :: launder ?

1 Ответ

1 голос
/ 27 апреля 2019

Функции mmap возвращают указатель void, и правила псевдонимов строгого типа не применяются к указателям void, поскольку они не указывают на фактический тип, но должны быть преобразованы во что-то перед доступом. Так что в C ++ абсолютно законно использовать C-подобные приведения или более лучшие static_casts для пустых указателей.

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

...