[英]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;
}
您嘗試同步進程的方式將無法正常工作,因為您創建的每個進程都會擁有自己的p1ready
和p2ready
副本。
您似乎要尋找的是某種進程間通信。 您可能需要看一下http://en.wikipedia.org/wiki/Inter-process_communication來查看可能的選項列表。
在一個簡單的情況下(如您的問題中提到的那樣),很可能向父進程發送兩個子進程信號就足夠了,所以我建議您最好看一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.