我正在玩一些c代码,尝试让一系列子进程执行一些异步工作,然后进行一些同步工作。
父母负责组织孩子的同步性。
以下是代码中的一般概念:
#define CHILDREN 5
void myHandle(int d) {}
int main () {
int i;
int pid[CHILDREN];
signal(SIGUSR1, myHandle);
for(i = 0 ; i < CHILDREN ; i++ ){
pid[i] = fork();
if (pid[i] == 0 ){
// DO SOME ASYNCHRONOUS WORK
// tell my parent I am done:
kill(getppid(), SIGUSR1);
// wait for parent to wake me up.
pause();
// DO SOME SYNCHRONOUS WORK
//wake parent back up.
kill(getppid() , SIGUSR1);
exit(1);
}
}
// Wait for all children to finish async work:
for (i = 0 ; i < CHILDREN ; i++) {
pause(); // ISSUE IS HERE
}
// wake children back up in order:
for (i = 0 ; i < CHILDREN ; i++ ) {
kill(pid[i], SIGUSR1);
// wait for child to finish work.
pause();
}
return 0;
}
此代码实际上有效(大部分时间)。问题是父进程在for循环中暂停。在某些情况下,多个孩子同时完成他们的异步工作,导致许多对父母的杀戮。循环不能足够快地迭代以使父进程对所有kill调用都处于暂停状态,导致程序卡在没有接收到信号的暂停上。
任何帮助或建议都会很棒 - 谢谢大家!
答案 0 :(得分:1)
一个可能的解决方案是在主函数中有一个大小为CHILDREN的数组。当孩子完成后,在他的数组元素中加上一个值。然后父亲必须检查数组中的所有标志是否都已启动。
这样,孩子之间就不会有写冲突,因为他们每个人都有自己的区域