このコードを機能させようとして困っています。私がやろうとしているのは、特定のアルゴリズムを並行して計算するようにプログラムを作成することです。機能する場合もあれば、機能しない場合もあります。これは、大きな数で実行するとよく発生しますが、トップ (linux コマンド) で多くの機能していないプロセスを確認できます。これは、フォークが非同期で終了し、一部の子プロセスが取り残されているために発生すると考えられます。しかし、最初は、両方とも共有メモリ空間であり、while ループを終了するために使用される 2 つの制御変数、フラグ、および alldone を設定したため、私のロジックは少なくともすべての計算を終了できると考えていました。私は光を探していましたが、私を助けるものが見つからないので、助けを求めるためにここに来ました. 次のコードの論理的な問題を解決して、機能していないプロセスを残さずに正しい順序でプロセスを終了できる方法を教えてください。前もって感謝します!
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);
}