2

我试图让 2 个进程同时启动一个任务(例如,计算一个数字)。我设置了 2 个就绪标志,每个进程一个,并执行一个 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 中,只有他们自己的就绪标志设置为 1。他们看不到另一个孩子的标志正在设置。比如child1只看到p1ready=1,但是p2ready一直是0,为什么会这样呢?我怎样才能解决这个问题?

提前致谢!

4

2 回答 2

4

当您执行 fork() 时,每个进程都会获得一个新的私有地址空间。父母和孩子不会共享任何数据。这就是进程间通信机制进入的地方。

您可能会使用信号量。请参阅此链接:

进程的信号量等价物?.

http://www.csc.villanova.edu/~mdamian/threads/posixsem.html

您可以在父节点上准备信号量,让每个子节点在每次分叉后等待它,然后在父节点中释放它们。两个子进程将同时释放并继续执行。当然,哪些先执行取决于操作系统执行调度程序。

    #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;
    }
于 2013-03-24T23:42:51.600 回答
2

您尝试同步流程的方式不会奏效,因为您创建的每个流程都有自己的p1readyand副本p2ready

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

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

于 2013-03-24T23:36:57.850 回答