C - 迭代多叉

时间:2010-07-09 14:49:51

标签: c fork

我需要制作4个叉子1000次。我写了这个,但它永远运行:

#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);
}

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

3 个答案:

答案 0 :(得分:6)

因为在每个fork()之后,子进程继续父进程所在的代码。因此,父进程和子进程都继续运行for循环,而不仅是父进程,而且子进程也继续运行。

答案 1 :(得分:2)

每次调用break;后都需要chunkXXX(),但是最后一个(父进程),并从子块中调用exit()

答案 2 :(得分:1)

wait(NULL)会导致主线程等到所有孩子都退出。要打破无限循环,请将chunk0,chunk1和chunk2调用exit终止。

此外,正如其他人所指出的,每次调用chunk0-chunk2后都需要一个break语句。