LINUX.ORG.RU

Ищу паттерн/структуры данных

 ,


1

3

Есть список pod объектов в shared memory (ну предположим std::array + size_t текущего размера). Он виден приложеням-«клиентам» как read-only, а приложению-«серверу» - как r/w. Уже есть канал приема запросов на изменение объектов от клиентов к серверу.

Так вот, нужно сделать параллельные структуры данных на стороне сервера, которые были бы связаны с объектами из shm (такой себе backend). Задача - упростить работу при добавлении/удалении/перемещении объектов в std::array в shm, чтобы не нужно было в каждом таком случае синхронно делать аналогичные действия для параллельных структур. Доступ обычно нужен с параллельной структуры даных в объект в shm.

★★★★★

чтобы не нужно было в каждом таком случае синхронно делать аналогичные действия для параллельных структур…

используй placement new для конструирования объекта в предоставленной памяти

anonymous2 ★★★★★
()

Не понятно. Опиши какие классы у тебя есть, лучше кодом, хотя бы на уровне интересующих нас в данном случае методов. И напиши (а лучше нарисуй) кто чем владеет и чего хочется достичь.

Сейчас ты в контексте, и тебе кажется, что ты понятно объяснил, но объяснять нужно так, как будто (так и есть) человек первый раз слышит про проект и ничего о нем не знает.

zx_gamer ★★★
()
Ответ на: комментарий от anonymous2

Placement new ведь просто создаст объект в указанной памяти.

Однако, если внутри контейнера будет выделяться ещё память, указатели будут уже указывать на нерасшаренные её сегменты, вроде?

Причём в стандарте нет гарантий о внутреннем представлении контейнера std::array в памяти. Вроде даже если будет работать, то лишь как частный случай.

По идее, во все STL-контейнеры можно передавать кастомные аллокаторы. Можно написать такой, чтобы выделял память в shmem. Но я не уверен, будут ли даже эти указатели актуальны в другом процессе…

Можно ещё сделать свою структуру данных, оптимизированную под расшаривание.

Можно ещё посмотреть, как работает Boost::Interprocess. У них есть свои какие-то готовые решения поднятой в топике проблемы.

witaway
()
Последнее исправление: witaway (всего исправлений: 1)

Задача - упростить работу при добавлении/удалении/перемещении объектов в std::array в shm, чтобы не нужно было в каждом таком случае синхронно делать аналогичные действия для параллельных структур. Доступ обычно нужен с параллельной структуры даных в объект в shm.

В предположении что у «сервера» эксклюзивный ownership над объектами в SHM - закешировать указатель в SHM ничего не стОит, вне зависимости от того в SHM лежит копия или «оригинал». Думается мне что проблема таки в другом - как интерпретировать содержимое SHM на стороне клиентов без полного скана сегмента и с минимальным локингом, угадал?

bugfixer ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.