Повышение межпроцессного режима: возможно, существует внутренняя тупиковая ситуация?

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

Например, я создаю определенный объект данных и сохраняю его в памяти с именем map_name. Затем я запускаю этот код:

void findContinuously(const char* map_name) {
    managed_shared_memory segment(open_only,"MySharedMemory");
    while(true) {
        DataObject *myMap = segment.find<DataObject>(map_name).first;
        bsl::cout << myMap << bsl::endl;
    }
}

Первый раз, когда я запускаю его после создания объекта, все в порядке. Он непрерывно печатает адрес. Я тогда Ctrl-C это. Запустите это снова. Ctrl-c это. Я повторяю этот процесс снова и снова. В конце концов, может быть, это запустить 3, программа зависает, никогда не печатает адрес, но никогда не выходит. Я нажму ctrl-c и попробую еще раз, но безрезультатно. С этого момента объект недоступен. Кроме того, я больше не могу создавать новые объекты в этом сегменте managed_shared_memory.

У меня есть теория, почему это происходит. Объект managed_shared_memory гарантирует, что создание объекта и поиск являются атомарными. Вероятно, это достигается благодаря наличию некоторого мьютекса в общей памяти. Вызывающий процесс обращается к менеджеру сегмента, который получает этот мьютекс. Процесс умирает до того, как менеджер сегмента освобождает мьютекс. Мьютекс навсегда заперт.

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

Мысли? У меня нет обходного пути для этого. Это мешает мне использовать повышение межпроцессного в производстве, потому что процессы иногда убивают. Я не могу рисковать, заблокировав весь блок памяти. Но мне трудно поверить, что разработчики Boost не предвидели эту ситуацию.

1 ответ

Попробуйте использовать typedef для базовой_managed_shared_memory по умолчанию с нулевым семейством мьютексов узких символов: typedef Basic_managed_shared_memory<char, rbtree_best_fit<null_mutex_family>, iset_index> Managed_shared_memory_null_mutex; И используйте надежную межпроцессную блокировку вне управляемого_shared_memory_null_mutex, например семфор system V.

Другие вопросы по тегам