C - итерационные множественные вилки - PullRequest
0 голосов
/ 09 июля 2010

Мне нужно сделать 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 ]

6 голосов
/ 09 июля 2010

Потому что после каждого fork () дочерний процесс продолжает код, из которого находится родительский процесс. Таким образом, родительский и дочерний процессы продолжают выполнять цикл for, и не только родительский процесс, но и дочерние процессы продолжают разветвляться.

2 голосов
/ 09 июля 2010

Вам нужно ставить break; после каждого вызова chunkXXX(), но последний (отцовский процесс), и вызывать exit() из дочерних блоков.

1 голос
/ 09 июля 2010

wait (NULL) заставляет ваш основной поток ждать, пока не выйдут все дочерние элементы. Чтобы разорвать бесконечный цикл, вызовите выход chunk0, chunk1 и chunk2 для завершения.

Кроме того, как уже отмечали другие, оператор break требуется после каждого вызова chunk0-chunk2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...