Пользовательский распределитель для STL Map в C ++ - PullRequest
0 голосов
/ 26 июня 2019

Я хочу создать собственный распределитель для мультикарты, который будет распределять элементы в разделяемой памяти. Я натолкнулся на boost.interprocess, но нашел его довольно сложным для реализации. Есть ли другой обходной путь?

1 Ответ

0 голосов
/ 26 июня 2019

Я не буду приводить здесь какую-либо реализацию, а дам вам несколько указаний. Если ваша абстракция разделяемой памяти или регион, например, начинаются с адреса void * shMemAddr и если вы решите, что ваш контейнер stl будет использовать разделяемую память, необходимо сделать так, чтобы контейнер выделял память, начиная с shMemAddr и далее, до тех пор, пока в вашем общем пуле не будет доступной памяти для выделения. Вы можете реализовать это, используя любую стратегию размещения, например, используя malloc или place new. Кроме того, чтобы ваш контейнер мог использовать ваш распределитель, вы должны предоставить свой распределитель в качестве аргумента шаблона, для multimap это будет multimap :: allocator_type класс Alloc = allocator> в качестве четвертого аргумента шаблона, после того, как функция сравнения будет меньше, и, например, если вы храните в своих многопользовательских парах int, double как key, пары значений, вероятно, это будет что-то вроде

multimap<int,double,less<int>,CustomAlloc<pair<int,double>>>

Теперь ваш распределитель CustomAlloc должен удовлетворять концепции распределителей, которые инкапсулируют определенное низкоуровневое управление памятью, особенно, если разделяемая память - это ресурс, который должен быть выделен, вам необходимо организовать правильное распределение памяти в многопоточном окружении. Это означает, что, во-первых, вам нужна некоторая структура для доказательства используемой памяти. Например, это может быть некоторая цепочечная структура данных, и подобные реализации довольно распространены, поэтому вам необходимо поддерживать согласованность инвариантов этой структуры. Это означает, что если ваша структура для учета использованной (или свободной) памяти должна быть обновлена ​​после успешного выделения или освобождения, то это нужно сделать атомарно, поэтому поток, который, возможно, пытается выделить память, видит только структуру в состояниях перед заданием распределения CustomAllocator. запускается или после завершения задания на выделение. Например, ваш первый выбор - использовать мьютекс для защиты данных, предотвращения гонок и сохранения инвариантов. Это всего лишь указания, и, учитывая, что написать свой собственный распределитель не очень сложно, я надеюсь, что это поможет в качестве хорошей отправной точки.

...