我需要制作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);
}
我知道为什么,但不知道如何解决它
答案 0 :(得分:6)
因为在每个fork()之后,子进程继续父进程所在的代码。因此,父进程和子进程都继续运行for循环,而不仅是父进程,而且子进程也继续运行。
答案 1 :(得分:2)
每次调用break;
后都需要chunkXXX()
,但是最后一个(父进程),并从子块中调用exit()
。
答案 2 :(得分:1)
wait(NULL)会导致主线程等到所有孩子都退出。要打破无限循环,请将chunk0,chunk1和chunk2调用exit终止。
此外,正如其他人所指出的,每次调用chunk0-chunk2后都需要一个break语句。