写入mmapped内存中的某个位置后,再打印出来时,就不再写入了

问题描述 投票:1回答:1

我正在尝试将多维数组中的一堆整数映射到映射内存中。我知道计算有效,因为我打印了多维数组,并且打印了正确的值。然后,我比较了double for循环中的值,在分配了多维数组的值之后,将它们打印在了mmapped内存中的位置,它们都对应于相同的值。

当我离开for循环并打印出映射内存中的内容时,只有第一个和最后一个值才能正确打印。相反,当我直接打印多维数组时,它确实会打印正确的值。我写入映射内存错误吗?

这是我的代码的(一部分)-我的程序有点大,所以我无法复制所有内容,而不会使其变得过于压倒性,但是我会尽力复制相关内容:

这是存储所需指针的结构; pthread_create()调用需要struct:

21 typedef struct {
 22    int *shmem1; //matrix 1
 23    int *shmem2; //matrix 2
 24    int matrix_size;
 25    char *file;
 26    int *shmem3; //result mmapping
 27 } args_mm;

此代码是pthread_create()所调用的,并且是主要问题所在。

180 void *multiply_matrices(void *arg)
181 {
182    args_mm *args = (args_mm *) arg;
183    printf("%d %d %d\n", args->shmem1[0], args->shmem2[0], args->matrix_size);
184    printf("%s\n", args->file);
185    int i,r,c;
186    int ms = args->matrix_size;
187    int m[ms][ms];
188    int item;
189    //printf("Resulting Matrix: %d\n", args->shmem3[0]);
190
191    for(r=0; r<ms; r++) {
192       for(c=0; c<ms; c++) {
193          m[r][c] = 0;
194          for(i=0; i<ms; i++) {
195             m[r][c] += (args->shmem1[r+i])*(args->shmem2[i+c]);
196             //args->shmem3[r+c] += (args->shmem1[r+i])*(args->shmem2[i+c]);
197          }
198          printf("\nBefore: %d, %d\t", m[r][c], args->shmem3[r+c]);
199          args->shmem3[r+c] = m[r][c];
200          printf("After: %d\n", args->shmem3[r+c]);
201       }
202    }
203
204    for(r=0;r<ms; r++) {
205       for(c=0; c<ms; c++) {
206          args->shmem3[r+c] = m[r][c];
207          printf("%d/%d ", args->shmem3[r+c], m[r][c]);
208       }
209       printf("\n");
210    }
211
212    printf("%d\n", args->shmem3[11]);
213
214    return NULL;
215 }

主程序的一部分(代码的其余部分仅分析标志并计算多维数组的大小。

217 int main(int argc, char *argv[])
218 {

239    //create mmap memory for both matrices
240    int *sh1 = create_mmap_mem(file1, file1_size, 0); //matrix 1 in here
241    int *sh2 = create_mmap_mem(file2, file2_size, 0); //matrix 2 in here
242    int *sh3 = create_mmap_mem(product_file, file1_size, 1); //result matrix here
243    args_mm args = {sh1, sh2, file1_size, product_file, sh3};
244
245    //divide the work evenly
246    //no of tasks simultaneously avail=matrix size^3
247    //printf("Shared Mem 1: %d\n", sh1[0]);
248    //printf("Shared Mem 2: %d\n", sh2[0]);
249    //printf("Thread size: %d\n", threadsize);
250
251    //for(i=0; i<threadsize+1; i++) {
252       pthread_create(&p, NULL, multiply_matrices, &args);
253       pthread_join(p, NULL);
254    //}

这是我自己打印多维数组(m[r][c])时的输出:

1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1

这是打印映射的内存(args->shmem3[r+c])时的输出:

1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1

希望我解释得足够好。如果需要,我可以澄清任何事情。我已经坚持了很长一段时间,我想知道我是否看不到这明显的东西?谢谢。

c mmap
1个回答
0
投票

我不认为这

199          args->shmem3[r+c] = m[r][c];

是您想要的。而是:

199          args->shmem3[r*args->matrix_size+c] = m[r][c];
© www.soinside.com 2019 - 2024. All rights reserved.