我正在尝试让两个进程同时启动一个任务(例如,计算一个数字)。我设置了两个就绪标志,每个进程一个,并执行一个while循环来检查两个标志是否都已启动。然后,在检查通过后,2个进程将开始计数。这是不工作的代码,我不知道为什么:
int p1ready=0;
int p2ready=0;
int onebil = 1000000000;
int main(){
int pid;
int exit_code;
pid=fork();
if(pid==0){
//child1
int count1=0;
p1ready=1; //signal
while(!(p1ready&p2ready))'//wait until 2 processes are both ready
while(count1!=onebil){
count1++;
}
exit(0);
}
else{
pid=fork();
if(pid==0){
//child2
int count2=0;
p2ready=1; //signal
while(!(p1ready&p2ready));//wait until 2 processes are both ready
while(count2!=onebil){
count2++;
}
exit(0);
}
else{
//parent
//do stuff
}
return 0;
}
此代码的问题是,在child1和child2中,只有自己的ready标志设置为1.它们无法看到正在设置的另一个子标志。例如,child1只看到p1ready = 1,但p2ready总是为0.为什么会这样?我怎样才能解决这个问题?
提前致谢!
答案 0 :(得分:3)
当你执行fork()时,每个进程都会获得一个私有的新地址空间。家长和孩子不会共享任何数据。这就是进程间通信机制进入的地方。
您可以使用信号量。请看这个链接:
semaphore equivalent for processes?
http://www.csc.villanova.edu/~mdamian/threads/posixsem.html
您可以在父级上准备信号量,让每个孩子在每个分叉后等待它,然后在父级中释放它们。两个子进程都将被释放并同时继续执行。首先执行哪些取决于OS执行调度程序。
#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
int p1ready=0;
int p2ready=0;
int onebil = 1000000000;
int main(){
int pid;
int exit_code;
// create a semaphore for each child: value=0
sem_t *sem1 = sem_open("test_semaphore", O_CREAT|O_EXCL);
sem_t *sem2 = sem_open("test_semaphore", O_CREAT|O_EXCL);
pid=fork();
if(pid==0){
//child1
// wait on semaphore => blocks if value <= 0
sem_wait(sem1);
int count1=0;
// do work => a function might be better
while(count1!=onebil){
count1++;
}
exit(0);
}
else{
pid=fork();
if(pid==0){
//child2
// wait on semaphore => blocks if value <= 0
sem_wait(sem2);
// do work
int count2=0;
while(count2!=onebil){
count2++;
}
exit(0);
}
else{
//parent
// signal semaphore1 (increment) releasing child 1
sem_post(sem1);
// signal semaphore2 (increment) releasing child 2
sem_post(sem2);
// do work
// wait for child1/child2
int status;
wait(&status); // a child has exited
// do something with status
wait(&status); // another child has exited
// do something with status
}
return 0;
}
答案 1 :(得分:2)
您尝试同步流程的方式不会起作用,因为您创建的每个流程都有自己的p1ready
和p2ready
副本。
您似乎在寻找的是某种过程间的沟通。您可能需要查看http://en.wikipedia.org/wiki/Inter-process_communication以查看可能的选项列表。
在一个像你问题中提到的那个简单的情况下,最有可能向你的子进程发送来自父进程的信号就足够了,所以我建议你最好看一下。