2

我在尝试使此代码正常工作时遇到了麻烦。我想做的是让我的程序并行计算一些特定的算法。有时有效,有时无效。当我用大数字运行它时,经常会发生这种情况,但是我可以在顶部(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);
    }
4

4 回答 4

1

如果alldone在共享内存中,则需要应用原子减量。否则,您的alldone计数器可能会处于不一致的状态。如果您使用的是 GCC,则可以使用内置函数进行减量。

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

您在上面的代码中启动了多个孩子,但您只调用wait()了一次。您需要等待所有孩子终止,而不仅仅是其中一个。

于 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 回答