Ускорьте межпроцесс не хотите удалять объект общей памяти перед инициализацией

#c #boost #shared-memory #boost-interprocess

#c #повышать #общая память #повышение-межпроцесс

Вопрос:

У меня есть этот базовый класс для использования общей памяти. В примерах Boost используется структура удаления, как показано ниже, для обработки общей памяти. Который я адаптировал для своего класса SharedMemBase

 //Remove shared memory on construction and destruction  struct shm_remove  {  shm_remove() { shared_memory_object::remove("MySharedMemory"); }  ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }  } remover;  

Я не хочу удалять объект общей памяти при построении. В случае, если его использует другой процесс, я хочу оставить его как таковой.

Теперь, если я оставлю только деструктор и если в main возникнет какое-либо необработанное исключение, деструктор не будет вызван, и, следовательно, мой объект общей памяти не будет удален.

В следующий раз, когда я попытаюсь создать объект, создание не будет успешным, так как объект общей памяти существует.

Чего я хочу добиться с помощью этого, так это иметь один объект общей памяти с именем ввода. Если какой-либо другой процесс попытается выполнить bip::create_only с тем же именем, он должен завершиться неудачей, что можно сделать с помощью моего кода ниже. Проблема в том, что при возникновении необработанных исключений gt; деструктор не вызывается gt;gt; оставляет файл в общей памяти gt;gt;gt; Не удается создать экземпляр моего класса.

 namespace bip = boost::interprocess;  class SharedMemBase { protected:  bip::shared_memory_object shm_;  const std::string name_;   bip::shared_memory_object createShm(const std::string amp;name)  {  try  {  //this is what boost has in examples  // dont want to remove shared object if another process  // is using it.  // bip::shared_memory_object::remove(name.c_str());  return bip::shared_memory_object(  bip::create_only, name.c_str(), bip::read_write);  }  catch (const bip::interprocess_exception amp;e)  {  std::cerr lt;lt; "Shared memory object exists with name: "  lt;lt; name lt;lt; std::endl;  throw e;  }  }  public:  SharedMemBase(const std::string amp;name)  : name_(name),  shm_(createShm(name)) {}   ~SharedMemBase()  {  //this is fine  bip::shared_memory_object::remove(name_.c_str());  } };  int main() {  SharedMemBase shm_obj("name");   throw std::runtime_error("Some random unhandled exception");   return 0; }  

Комментарии:

1. Разве вы не можете использовать open_or_create вместо create_only этого ?

2. Просто попробовал. Что это делает, так это то, что он открывает файл из процесса 1, затем процессу 2 также разрешается открывать и записывать в него, что нарушает мое требование (1 процесс с именем общей памяти может создать только 1 экземпляр). Однако он успешно находит и открывает его.