Вопросы о повышении общей памяти

Я пытаюсь создать простой, но портативный способ использования общей памяти. Boost::interprocess казалось хорошим местом для начала, но я столкнулся с некоторыми проблемами / проблемами.

  1. Могу ли я как-то запросить существование сегмента shm, желательно используя boost API? Я всегда мог попытаться создать его, используя create_only и поймать исключение, но это плохой дизайн, я не хочу раскручивать стек в «хорошем» пути.
  2. Могу ли я обрезать сегмент, даже когда другие процессы присоединены? (если, конечно, я займусь синхронизацией) Я полагаю, что все остальные процессы придется переназначить, они также должны будут повторно присоединиться?
  3. Boost doc говорит, что на windows портативный shared_memory_object на самом деле это не разделяемая память, а файл с отображением в памяти. Я правильно понял? Это означает, что мне придется использовать специализированный код на Windows, который я пытался избежать. Возникает вопрос о пригодности Boost для моих целей, есть ли альтернатива? Вместо того, чтобы бороться с boost, я мог бы сам написать код для платформы — по вашему мнению, стоило ли это усилий?

3

Решение

  1. нет, это не плохой дизайн. Это стандартный способ сделать это с IPC. У вас (обычно) нет доступа к системе именования, и у вас есть своего рода список существующих объектов, таких как файловая система.
  2. Если я хорошо помню: если вы урежете при отображении, будут нарушения памяти на новых недействительных адресах (если защита памяти поддерживается). Вам не нужно переназначать, вы просто должны позаботиться о том, что вы делаете. Я не уверен, что вам действительно нужно обрезать SHM, но это ваша проблема.
  3. это не проблема, это просто означает, что базовый объект является файлом, потому что стандартная семантика для SHM включает постоянство. Но пофиг, это интуитивные трюки. Семантика — это то, что вам нужно, поэтому используйте ее, чтобы получить мобильность!
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]