2

このコードを機能させようとして困っています。私がやろうとしているのは、特定のアルゴリズムを並行して計算するようにプログラムを作成することです。機能する場合もあれば、機能しない場合もあります。これは、大きな数で実行するとよく発生しますが、トップ (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);
    }
4

4 に答える 4

1

が共有メモリにある場合alldoneは、アトミックデクリメントを適用する必要があります。そうしないと、alldoneカウンターが一貫性のない状態のままになる可能性があります。GCCを使用している場合は、組み込みを使用してデクリメントを実行できます。

__sync_sub_and_fetch(alldone, 1);
于 2012-08-07T22:11:28.807 に答える
1

上記のコードで複数の子を開始しますが、呼び出しwait()は1回だけです。1人だけでなく、すべての子が終了するのを待つ必要があります。

于 2012-08-07T22:12:03.360 に答える
1

これはあなたの問題とは関係ありませんが、実際にはこれを変更する必要があります:

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)--;
}

これに:

if(thisfork >= 0 && thisfork <=7){
    heme((7 - thisfork),riall,chunk_size*(8 - thisfork),r,pp,qq);
    (*alldone)--;
}
于 2012-08-07T22:16:08.337 に答える
0

wait()子が終了または完了するまで親プロセスを停止する機能を使用できます。

于 2012-08-08T18:51:35.383 に答える