пользовательский распределитель для карты stl в С++

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


person Bhagyashree Sahoo    schedule 26.06.2019    source источник
comment
Возможный дубликат stackoverflow.com/questions/11373796 /   -  person xeco    schedule 26.06.2019
comment
Возможный дубликат настраиваемого распределителя памяти для карты STL   -  person xeco    schedule 26.06.2019


Ответы (1)


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

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

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

person Boki    schedule 26.06.2019