【问题标题】:How do I store a vector of float vectors in shared memory in C++?如何在 C++ 中将浮点向量的向量存储在共享内存中?
【发布时间】:2014-02-23 18:16:38
【问题描述】:

我需要将浮点向量的向量存储在 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;
}  

但是,据我了解,使用数据类型 vector> 而不是简单的整数,这要困难得多。我是否需要编写一个自定义分配器(如果需要,是否有任何简单的方法可以做到这一点?我发现的例子都非常复杂......)来完成这项工作,或者这个例子有一个简单的扩展那会让我在共享内存中放置一个向量>?

【问题讨论】:

  • 查看 Boost.Interprocess。
  • 不幸的是,这实际上是一个明确提到“不要使用 Boost”的家庭作业。我只是想知道是否有一种干净的方法可以做到这一点......
  • 您需要反序列化您的矢量内容!
  • 你能再解释一下吗,我不听...

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


【解决方案1】:

不可能将std::vector&lt;T&gt; 存储在共享内存区域中,因为向量内的实际元素并未存储在std::vector&lt;T&gt; 的内存中,而是在堆上分配的。

从技术上讲,您可以构建自己的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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多