簡體   English   中英

同步2個進程

[英]synchronizing 2 processes

我試圖使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。為什么會這樣? 我怎樣才能解決這個問題?

提前致謝!

當您執行fork()時,每個進程都會獲得一個私有的新地址空間。 父母和孩子不會共享任何數據。 這就是進程間通信機制進入的地方。

您可以使用信號量。 看到此鏈接:

信號量等效於進程?

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

您可以在父級上准備信號量,讓每個子級在每個fork之后等待它,然后在父級中釋放它們。 這兩個子進程都將被釋放並同時繼續執行。 當然,哪個首先執行取決於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;
    }

您嘗試同步進程的方式將無法正常工作,因為您創建的每個進程都會擁有自己的p1readyp2ready副本。

您似乎要尋找的是某種進程間通信。 您可能需要看一下http://en.wikipedia.org/wiki/Inter-process_communication來查看可能的選項列表。

在一個簡單的情況下(如您的問題中提到的那樣),很可能向父進程發送兩個子進程信號就足夠了,所以我建議您最好看一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM