От макушки головы, я не знаю ни одной библиотеки, которая делает это.
Я знаю, что если вы пишете свою собственную или изменяете существующую библиотеку, вам нужно хитроумно отследить и исправить любой код, использующий указатели, и заменить его кодом, который использует base + offset.
Основой будет указатель, возвращаемый функциями создания / открытия разделяемой памяти, и он будет отличаться в каждом процессе. Смещение заменяет то, что будет указателем. Когда вам нужно найти значение с помощью смещения, вы приводите базу к char*
, добавляете к ней смещение, а затем приводите к your_type*
. Что-то вроде (bucket_t*)((char*)base + offset)
.
Это предполагает, что вашей хеш-реализации вообще нужны указатели. Некоторые этого не делают, если используют только однозначные сегменты и не имеют списков значений.
Другая хитрость в том, что вам нужно управлять памятью самостоятельно. Вместо вызова malloc () вы создаете свою собственную функцию, возможно, называете ее shm_hash_alloc (). Быстрый старт состоит в том, чтобы просто сохранить указатель и увеличить его при распределении памяти и не беспокоиться о его освобождении. Позже вы можете использовать массив указателей (смещений) для освобождения списков различной степени двух размеров или, если вы знаете свои типы объектов, список для каждого типа. В каждом свободном блоке вы сохраняете указатель на следующий свободный блок и знаете размер, из-за какого списка он находится. Есть даже более причудливые методы, но, вероятно, они вам не нужны.