#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 экземпляр). Однако он успешно находит и открывает его.