2010-07-09 73 views
0

我需要做4次分叉1000次。我写了这一点,但它永远运行下去:C - 迭代多叉

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <sys/types.h> 

#define N 512 

void chunk0(void); 
void chunk1(void); 
void chunk2(void); 
void chunk3(void); 
double get_time(void); 

void main(void) 
{ 
    int i,j,k,iterations=0; 
    unsigned int *a=(unsigned int *)malloc(N*N*(sizeof(unsigned int))); 
    unsigned int *b=(unsigned int *)malloc(N*N*(sizeof(unsigned int))); 
    unsigned int *c=(unsigned int *)malloc(N*N*(sizeof(unsigned int))); 
    pid_t pid; 

    for(iterations=0;iterations<1000;iterations++){ 
     srand (time(NULL)); 
     double start=get_time(); 

     pid = fork(); 
     if (pid == 0) { 
      chunk0(); 
     }else { 
      pid = fork(); 
      if (pid == 0){ 
       chunk1(); 
      }else { 
       pid = fork(); 
       if (pid == 0){ 
        chunk2(); 
       }else { 
        chunk3(); 
        wait(NULL); 
        double end=get_time(); 
        double diff=end-start; 
        printf("\n Time for run this code is: %lf seconds \n",diff); 
       } 
      }   
     } 
    }  
} 

void chunk0(void) 
{ 
/* int i,j,k,iterations=0; 
    unsigned int *a=(unsigned int *)malloc(N*N*(sizeof(unsigned int))); 
    unsigned int *b=(unsigned int *)malloc(N*N*(sizeof(unsigned int))); 
    unsigned int *c=(unsigned int *)malloc(N*N*(sizeof(unsigned int))); 

    for(iterations=0;iterations<1000;iterations++){ 
     //printf("iteration #%d: Generating Matrix - ",iterations+1); 
     for(i=0;i<N;i++){ 
      for(j=0;j<N;j++){ 
       //give int number between 0...1000 to a[i][j] , b[i][j] and reset c[i][j] 
       *(a+(i*N+j))=(rand()%1001); 
       *(b+(i*N+j))=(rand()%1001); 
       *(c+(i*N+j))=0; 
      } 
     } 
     //printf("Multiplying ... \n"); 
     for(i=0;i<N;i++){ 
      for(j=0;j<N;j++){ 
       for(k=0;k<N;k++){ 
        *(c+(i*N+j))= *(c+(i*N+j)) + ((*(a+(i*N+k)))*(*(b+(k*N+j)))); 
       } 
      } 
     } 
    } 

    free(a); 
    free(b); 
    free(c); 
*/ 
    printf(" *** Child process 0 is done ***\n"); 
} 
void chunk1(void) 
{ 
    int i; 
    printf(" *** Child process 1 is done ***\n"); 
} 
void chunk2(void) 
{ 
    int i; 
    printf(" *** Child process 2 is done ***\n"); 
} 
void chunk3(void) 
{ 
    int i; 
    printf(" *** Child process 3 is done ***\n"); 
} 

double get_time(void){ 
    struct timeval stime; 
    gettimeofday (&stime, (struct timezone*)0); 
    return (stime.tv_sec+((double)stime.tv_usec)/1000000); 
} 

我知道为什么,但不知道如何解决它

+2

你知道为什么吗?与我们分享。 – Mau 2010-07-09 14:52:45

+1

从您的代码中取出相关摘录,而不是将其粘贴到其他网站上。 – sharptooth 2010-07-09 14:53:11

回答

6

因为每个叉()之后,子进程继续从那里父进程是代码。因此,父进程和子进程都继续运行for循环,不仅是父进程,而且子进程都继续分支。

1

wait(NULL)导致您的主线程等待,直到所有的孩子退出。为了打破无限循环,chunk0,chunk1和chunk2调用exit来终止。此外,正如其他人所指出的,每次调用chunk0-chunk2之后都需要一个break语句。

+0

非常感谢。 – RYN 2010-07-09 16:17:32

2

您需要在每次拨打chunkXXX()但最后一个(父进程)后拨打break;,并且从子组块中拨打exit()

+0

非常感谢。 – RYN 2010-07-09 16:18:38