我在尝试使此代码正常工作时遇到了麻烦。我想做的是让我的程序并行计算一些特定的算法。有时有效,有时无效。当我用大数字运行它时,经常会发生这种情况,但是我可以在顶部(linux 命令)中看到很多已失效的进程,我认为这是因为我的分叉正在结束异步并且一些孩子被抛在后面。但一开始我认为我的逻辑至少可以完成所有计算,因为我设置了 2 个控制变量、标志和 alldone,它们都是共享内存空间,用于完成 while 循环。我一直在寻找一些光,现在我来这里寻求帮助,因为我找不到可以帮助我的东西。谁能以某种方式帮助我解决以下代码中的逻辑问题,使我的进程可以按正确的顺序完成,避免留下失效的进程?提前致谢!
for(i=0;i<numforks*sizeof(int);i++)
flags[i] = 0;
*alldone = numforks;
pid = fork();
if(pid==0) {
pid1 = fork();
pid2 = fork();
pid3 = fork();
#ifdef DEBUG_F
printf("worker process\n");
#endif
do {
thisfork = thisfork -1;
if( flags[thisfork] == 0){
flags[thisfork] = 1;
#ifdef DEBUG_THREADS
printf("flags[%d] was zero now is %d\n", thisfork, flags[thisfork]);
#endif
if(thisfork == 7) {
heme(0,riall,chunk_size,r,pp,qq);
(*alldone)--;
}
if(thisfork == 6) {
heme(chunk_size,riall,chunk_size*2,r,pp,qq);
(*alldone)--;
}
if(thisfork == 5) {
heme(chunk_size*2,riall,chunk_size*3,r,pp,qq);
(*alldone)--;
}
if(thisfork == 4) {
heme(chunk_size*3,riall,chunk_size*4,r,pp,qq);
(*alldone)--;
}
if(thisfork == 3) {
heme(chunk_size*4,riall,chunk_size*5,r,pp,qq);
(*alldone)--;
}
if(thisfork == 2) {
heme(chunk_size*5,riall,chunk_size*6,r,pp,qq);
(*alldone)--;
}
if(thisfork == 1) {
heme(chunk_size*6,riall,chunk_size*7,r,pp,qq);
(*alldone)--;
}
if(thisfork == 0) {
heme(chunk_size*7,riall,chunk_size*8,r,pp,qq);
(*alldone)--;
}
}
} while( thisfork > 0 && alldone > 0 );
exit(0);
} else {
wait(&stat);
}