我在父进程中有以下代码:
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;
};
如何在孩子中正确接收我的载体?
答案 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仅复制指针,该指针在收件人一侧无效。