Как сохранить вектор векторов с плавающей точкой в разделяемой памяти в C ++?

0

Мне нужно сохранить вектор векторов float в общей памяти в C++. У меня есть пример игрушек, который работает, для хранения целого числа в общей памяти. Это код:

int main()
{
    int pid;
    int start = 0;
    int shmid;
    key_t key;
    key = 123;
    int *shm;

    if ((shmid = shmget(key, sizeof(int), IPC_CREAT | 0666)) < 0)
    {
        perror("shmget");
        exit(1);
    }   

    shm = (int *) shmat(shmid, NULL, 0);

    pid = fork();

    if (pid > 0)
    {   
        wait(NULL);
        cout << *shm << *(shm+1);
    }   
    else if (pid == 0)
    {    
        *shm = 6;
        *(shm+1) = 7;
    }   
    else
    {
        exit(-1);
    }   

    cout << endl;
    return 0;
}  

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

  • 0
    Проверьте Boost.Interprocess.
  • 0
    К сожалению, это на самом деле домашнее задание, в котором явно упоминается «не использовать повышение». Мне просто интересно, есть ли чистый способ сделать это ...
Показать ещё 2 комментария
Теги:
parallel-processing
shared-memory

1 ответ

0

Невозможно сохранить std::vector<T> в области разделяемой памяти, поскольку фактические элементы внутри вектора не сохраняются в памяти std::vector<T>, но выделяются в куче.

Технически вы могли бы построить свой собственный allocator, но я бы подумал, что проще просто сериализовать содержимое вашего вектора.

Что-то вроде этого:

vector<float> vec_f;
// some code fills vec_f .. 
float *shm;
shm = (float *) shmat(shmid, NULL, 0);

for(auto f : vec_f)
{
   *shm++ = f;
}

(Или, если вы не хотите использовать итерацию стиля C++),

for(size_t i = 0; i < vec_f.size(); i++)
{
    *shm++ = vec_f[i];
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню