gpt4 book ai didi

C 编程逻辑 - 尝试完成线程(fork)而不是留下失效的进程

转载 作者:太空狗 更新时间:2023-10-29 12:06:04 26 4
gpt4 key购买 nike

我在尝试使这段代码工作时遇到了麻烦。我想做的是让我的程序并行计算一些特定的算法。有时有效,有时无效。当我用大数字运行它时经常会发生这种情况,但我可以在 top(linux 命令)中看到很多已失效的进程,我认为发生这种情况是因为我的 fork 结束异步并且一些 child 被抛在后面。但我一开始认为我的逻辑至少可以完成所有计算,因为我设置了 2 个控制变量,flags 和 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);
}

最佳答案

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

__sync_sub_and_fetch(alldone, 1);

关于C 编程逻辑 - 尝试完成线程(fork)而不是留下失效的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11854798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com