我有一个使用共享内存对叉子进行矩阵乘法的赋值,然后将时间结果与不带叉子的乘法进行比较,所以这里是没有它们的乘法:
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;
}
答案 0 :(得分:2)
没有提供完整的解决方案,因为它是一项家庭作业,但是用于在Unix上获取共享内存的函数在此处记录:http://pubs.opengroup.org/onlinepubs/009695399/functions/shmget.html
您可以调用shmget()
,然后在每个子进程中传递给您shmat()
的标识符,以获取指向共享内存的指针。
另一种方法是让每个进程在管道中传回结果,并复制它们,但这会慢得多。另一种方法是使用线程而不是进程,因为线程共享内存。另一种是传递消息。另一个是内存映射文件。但是,您投射到结构指针的共享内存是最简单的方法,并且具有最佳性能。
最后,如果要写入相同的共享内存,则需要注意不要让两个进程写入同一内存。如果你每行打开一个进程,并且你的行正确对齐,你应该没有问题,但安全的方法是使用锁或原子变量。