如何发送vector <vector <type>&gt;通过MapViewOfFile </vector <type>

时间:2012-12-20 12:57:04

标签: c++ winapi file-mapping filemap

我在父进程中有以下代码:

vector<vector<double> > matrix(n); /* matrix NxM */
/* pushing data */
HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE,
    0, PAGE_READWRITE, 0, 2*sizeof(int) + sizeof(double)*n*m, lpName);

LPVOID lp = MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 0);

mat_tmp* tmp = (mat_tmp*)lp;
tmp->n = n; tmp->m = m;
tmp->vv = vector<vector<double> >(matrix.begin(), matrix.end());

在子进程中,我正在尝试接收此向量&gt;,但我的子进程每次都会终止。

LPTSTR lpName = _tcsdup(TEXT(map_name));
HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE,
    0, PAGE_READWRITE, 0, 2*sizeof(int) + sizeof(double)*n*m, lpName);
LPVOID lp = MapViewOfFile(hMapping, FILE_MAP_WRITE, 0, 0, 0);

mat_tmp * tmp = (mat_tmp*)lp;
vector<vector<double> > matrix(tmp->vv.begin(), tmp->vv.end());

当我尝试在子进程中使用matrix中的数据时发生错误。 小结构如下:

struct mat_tmp
{
    int n; int m; vector<vector<double> > vv;
};

如何在孩子中正确接收我的载体?

3 个答案:

答案 0 :(得分:1)

它不会像你现在这样做。映射的内存将包含n&amp; m和vector类的内部结构可能是几个指针,具体取决于你的STL实现。接下来是一堆垃圾。您将无法安全地从其他进程访问这些指针,因为它位于不同的地址空间中。

您需要实际将向量指向的内存复制到映射内存中,并在另一侧重建向量。

此外,您需要的内存大小不会是sizeof(int)* n * m。看起来你想要2个整数n&amp; m在结构和n * m双打的集合。

因此,分配2 * sizeof(int)+ n * m * sizeof(double)。复制n&amp; m进入内存然后复制矩阵的行。 在接收方,阅读n&amp; m然后将数据反序列化为矢量向量。

也许让结构像这样:

struct mat_tmp
{
    int n; int m; double vv[1];
};

然后,直接复制到共享内存中:

double* dst = tmp.vv;
for (size_t y = 0; y < matrix.size(); ++y) {
   memcpy(dst, &(matrix[y][0]), matrix[y].size()*sizeof(double));
   dst += matrix[y].size();
}

另一方面,

dst_matrix.resize(n);
for (size_t y = 0; y < n; ++y) {
    dst_matrix[y].resize(m);
    memcpy(&(dst_matrix[y][0]), tmp + (y * m), m * sizeof(double));
}

所有未经测试且可以更加优化,但希望它能更好地解释您需要做什么。

答案 1 :(得分:1)

您需要覆盖向量的默认分配器对象,以便它完全在MapView的内存空间中工作,因为默认的分配器对象将使用堆内存进行所有分配。有一篇非常古老的Dr.Dobbs文章,Bjarne Stroustrup(C ++的创建者)写道,它确切地说明了如何完成这项任务:

http://www.drdobbs.com/creating-stl-containers-in-shared-memory/184401639

答案 2 :(得分:0)

这不会起作用,向量只会保存一个指针,实际数据是堆分配的。您的memcpy仅复制指针,该指针在收件人一侧无效。