Важно ли, чтобы разделяемая память поддерживалась файлом? Если нет, вы можете рассмотреть возможность использования базовых API-интерфейсов разделяемой памяти Unix: shmget, shmat, shmdt и shmctl, все они объявлены в sys / shm.h. Я нашел их очень простыми в использовании.
// create some shared memory
int id = shmget(0x12345678, 1024 * 1024, IPC_CREAT | 0666);
if (id >= 0)
{
void* p = shmat(id, 0, 0);
if (p != (void*)-1)
{
initialize_shared_memory(p);
// detach from the shared memory when we are done;
// it will still exist, waiting for another process to access it
shmdt(p);
}
else
{
handle_error();
}
}
else
{
handle_error();
}
Другой процесс будет использовать что-то вроде этого для доступа к общей памяти:
// access the shared memory
int id = shmget(0x12345678, 0, 0);
if (id >= 0)
{
// find out how big it is
struct shmid_ds info = { { 0 } };
if (shmctl(id, IPC_STAT, &info) == 0)
printf("%d bytes of shared memory\n", (int)info.shm_segsz);
else
handle_error();
// get its address
void* p = shmat(id, 0, 0);
if (p != (void*)-1)
{
do_something(p);
// detach from the shared memory; it still exists, but we can't get to it
shmdt(p);
}
else
{
handle_error();
}
}
else
{
handle_error();
}
Затем, когда все процессы будут выполнены с общей памятью, используйте shmctl(id, IPC_RMID, 0)
, чтобы вернуть ее в систему.
Вы можете использовать инструменты ipcs и ipcrm в командной строке для управления общей памятью. Они полезны для устранения ошибок при первом написании кода общей памяти.
Несмотря на это, я не уверен в совместном использовании памяти между 32-битными и 64-битными программами. Я рекомендую попробовать API Unix, и если они потерпят неудачу, это, вероятно, не может быть сделано. В конце концов, именно они используют Boost в своей реализации.