同步2个进程

时间:2013-03-24 23:27:30

标签: c algorithm synchronization fork

我正在尝试让两个进程同时启动一个任务(例如,计算一个数字)。我设置了两个就绪标志,每个进程一个,并执行一个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.为什么会这样?我怎样才能解决这个问题?

提前致谢!

2 个答案:

答案 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)

您尝试同步流程的方式不会起作用,因为您创建的每个流程都有自己的p1readyp2ready副本。

您似乎在寻找的是某种过程间的沟通。您可能需要查看http://en.wikipedia.org/wiki/Inter-process_communication以查看可能的选项列表。

在一个像你问题中提到的那个简单的情况下,最有可能向你的子进程发送来自父进程的信号就足够了,所以我建议你最好看一下。