如何在C ++中将浮动向量的向量存储在共享内存中?

时间:2014-02-23 18:16:38

标签: c++ parallel-processing shared-memory

我需要在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;
}  

然而,我的理解是,使用数据类型向量&gt;这要困难得多。而不是一个简单的整数。我是否需要编写一个自定义分配器(如果有的话,有没有简单的方法可以做到这一点?我发现的例子都非常复杂......)使这个工作,或者是否有一个简单的扩展这个例子这将让我放置一个矢量&gt;在共享内存?

1 个答案:

答案 0 :(得分: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];
}