2012-03-13 43 views
0

)我试图用b [3] [4]乘以[2] [3],并将答案放在c [2] [4]中。 我必须使用fork()并为每个子c [0] [j]和c [1] [j]创建2个进程,父进程将等待。 所以每个子进程都会为c计算一行。这是我的代码:使用fork乘以2个2D数组(

//multiply a[2][3] * b[3][4] = c[2][4] 
//with fork 
//each child completes one c[2][4]'s row 
#include<stdio.h> 
#include<stdlib.h> 

main() 
{ 
    int a[2][3]={1,2,3, 
      4,5,6}; 
    int b[3][4]={1,2,3,4, 
      5,6,7,8, 
      9,10,11,12}; 
    int c[2][4]; 
     int i,j; 
    int m; //for the calculation 
    int n; //common 3 
    int pid; //fork 

    for(i=0;i<2;i++) 
    { 
    pid=fork(); 
    if(pid==-1) 
    { 
     printf("Can't fork\n"); 
    } 
    if(pid==0)//child 
    { 
     for(j=0;j<4;j++) 
     { 
    for(n=0;n<3;n++) 
    { 
     m=m+a[i][n]*b[n][j]; 
    } 
    c[i][j]=m; 
    m=0; 
     } 
     exit(EXIT_SUCCESS); 
    } 
    if(pid>0)//parent 
    { 
     wait(0); 
    } 
    } 
    printf("C:\n"); 
    for(i=0;i<2;i++) 
    { 
    for(j=0;j<4;j++) 
    { 
     printf("%d\t",c[i][j]); 
    } 
    printf("\n"); 
    }   
} 

我在编译没有错误,但我得到错误的号码......尴尬的大数字... 任何想法?

回答

0

问:我在编译时没有错误,但是我弄错了数字......尴尬 大数字......任何想法?

答:是的 - 那一刻你叉,你有两个完全独立的地址空间:)

一个很好的解决方案两个不同的过程是使用线程而不是fork()的:

https://computing.llnl.gov/tutorials/pthreads/

+0

谢谢,我搜索了一些,我认为管道将解决我的问题。目前有一些问题,但我正在尝试。你知道一个简单的例子来理解管道吗? – user1082307 2012-03-14 00:27:11