Отмена отображения ускоренной разделяемой памяти

У меня есть код, в котором повышенная разделяемая память используется одним писателем и многими читателями.

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

Читатели постоянно приходят и уходят, каждый считыватель сопоставляется с общей памятью с привилегиями read_only, делает то, что делает, а затем вызывает удаление.

Проблема, кажется, в том, что когда читатель заканчивает делать то, что он делает. Он вызывает remove, однако remove удаляет файл shared_memory для новых читателей, и они не могут его сопоставить.

У меня вопрос: как процесс отключается от общей памяти, не удаляя ее? Похоже, что в библиотеке boost нет функции отсоединения.


person Max Shifrin    schedule 09.03.2015    source источник
comment
Можете ли вы предоставить более подробную информацию о библиотеке ведьм, которую вы используете. Это boost.interprocess?   -  person Luka Rahne    schedule 09.03.2015
comment
Действительно. Может быть Boost Interprocess или Boost Iostreams   -  person sehe    schedule 09.03.2015
comment
#include ‹boost / interprocess / shared_memory_object.hpp›   -  person Max Shifrin    schedule 09.03.2015


Ответы (1)


У вас должна быть возможность использовать общий счетчик ссылок.

Общий общий указатель или семафор для этого.

Для Boost Interprocess закрытие не удаляет сопоставленный / общий объект. Только не призывать удалять.

person sehe    schedule 09.03.2015
comment
Как мне закрыть? Насколько я могу судить, вызова API-интерфейса нет, только удалить, что и является причиной моей проблемы. И я не хочу оставлять отображаемую разделяемую память после того, как закончу с ней в клиентах чтения. - person Max Shifrin; 09.03.2015
comment
Когда shared_memory_object, managed_shared_memory или managed_mapped_file выходит за пределы области видимости, он закрывается. Точно так же, как с std::fstream, правда. Это C ++ :) - person sehe; 09.03.2015
comment
но когда он закрыт, память не отображается на уровне процесса, я понимаю, что объект может выйти за пределы области видимости, но если общая память все еще остается отображенной в процессе, это проблематично - и чего я пытаюсь избежать. - person Max Shifrin; 09.03.2015
comment
Да хорошо. Это будет утечка ресурсов, и вы сообщите об этом как об ошибке. Подсказка: нет, этого не происходит. Да: общая карта памяти до удаления. Нет, он не остается на карте без вашего запроса - person sehe; 09.03.2015