2010-07-09 2 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

+1

Принесите соответствующую выдержку из вашего кода здесь, а не вставьте ее на другой сайт. – sharptooth

ответ

6

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

1

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

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

+0

Большое спасибо. – RYN

2

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

+0

Большое спасибо. – RYN

Смежные вопросы