C叉问题,结果错误,可能共享内存

时间:2015-09-30 05:38:54

标签: c fork shared-memory

我有一个使用共享内存对叉子进行矩阵乘法的赋值,然后将时间结果与不带叉子的乘法进行比较,所以这里是没有它们的乘法:

int matrizA[Am][An];
int matrizB[An][Bp];

//here i fill the matrix from a .txt file

int matrizR[Am][Bp];
int a,b,c;
for (a=0; a < Am; a++){
    for (b = 0; b < Bp; b++)
    {
        matrizR[a][b] = 0;
        for (c=0; c<An; c++){
            matrizR[a][b] += matrizA[a][c] * matrizB[c][b]; 
        }
    }
}

然后我尝试实现forks但结果是错误的,我不确定我是否必须实现共享内存以及matrizA,matrizB和matrizR2应该在哪里共享?我是怎么做到的?

int matrizR2[Am][Bp];
pid_t pids[Am][Bp];
int h,j;

/* Start children. */TY
for (h = 0; h < Am; ++h) {
    for (j=0; j<Bp ; ++j){
      if ((pids[h][j] = fork()) < 0) {
        perror("fork");
        abort();
      } else if (pids[h][j] == 0) {
        matrizR2[h][j] = 0;
        for (c=0; c<An; c++){
            matrizR2[h][j] += matrizA[h][c] * matrizB[c][j]; 
        }
        printf("im fork %d,%d\n",h,j);
        exit(0);
      }
    }
}
/* Wait for children to exit. */
int status;
pid_t pid;
while (n > 0) {
  pid = wait(&status);
  --n; 
}

1 个答案:

答案 0 :(得分:2)

没有提供完整的解决方案,因为它是一项家庭作业,但是用于在Unix上获取共享内存的函数在此处记录:http://pubs.opengroup.org/onlinepubs/009695399/functions/shmget.html

您可以调用shmget(),然后在每个子进程中传递给您shmat()的标识符,以获取指向共享内存的指针。

另一种方法是让每个进程在管道中传回结果,并复制它们,但这会慢得多。另一种方法是使用线程而不是进程,因为线程共享内存。另一种是传递消息。另一个是内存映射文件。但是,您投射到结构指针的共享内存是最简单的方法,并且具有最佳性能。

最后,如果要写入相同的共享内存,则需要注意不要让两个进程写入同一内​​存。如果你每行打开一个进程,并且你的行正确对齐,你应该没有问题,但安全的方法是使用锁或原子变量。

相关问题