Я пытаюсь создать простой, но портативный способ использования общей памяти. Boost::interprocess
казалось хорошим местом для начала, но я столкнулся с некоторыми проблемами / проблемами.
- Могу ли я как-то запросить существование сегмента shm, желательно используя boost API? Я всегда мог попытаться создать его, используя
create_only
и поймать исключение, но это плохой дизайн, я не хочу раскручивать стек в «хорошем» пути.
- Могу ли я обрезать сегмент, даже когда другие процессы присоединены? (если, конечно, я займусь синхронизацией) Я полагаю, что все остальные процессы придется переназначить, они также должны будут повторно присоединиться?
- Boost doc говорит, что на windows портативный
shared_memory_object
на самом деле это не разделяемая память, а файл с отображением в памяти. Я правильно понял? Это означает, что мне придется использовать специализированный код на Windows, который я пытался избежать. Возникает вопрос о пригодности Boost для моих целей, есть ли альтернатива? Вместо того, чтобы бороться с boost, я мог бы сам написать код для платформы — по вашему мнению, стоило ли это усилий?
3
Решение
- нет, это не плохой дизайн. Это стандартный способ сделать это с IPC. У вас (обычно) нет доступа к системе именования, и у вас есть своего рода список существующих объектов, таких как файловая система.
- Если я хорошо помню: если вы урежете при отображении, будут нарушения памяти на новых недействительных адресах (если защита памяти поддерживается). Вам не нужно переназначать, вы просто должны позаботиться о том, что вы делаете. Я не уверен, что вам действительно нужно обрезать SHM, но это ваша проблема.
- это не проблема, это просто означает, что базовый объект является файлом, потому что стандартная семантика для SHM включает постоянство. Но пофиг, это интуитивные трюки. Семантика — это то, что вам нужно, поэтому используйте ее, чтобы получить мобильность!
1
Другие решения
Других решений пока нет …