C++マルチプロセス信号量
質問:親プロセスサブプロセスで、親プロセスがサブプロセスと同期するように要求されます.サブプロセスが先に実行され、親プロセスが後に実行される必要があります.
解決方法:信号量メカニズムで、最初の信号量を0に初期化する
親プロセス:
ひりんかいいき
p(s)
りんかいいき
v(s)
ひりんかいいき
サブプロセス:
ひりんかいいき
v(s)
ひりんかいいき
これにより、親プロセスは臨界領域コードを実行する前にp操作を行うが、信号量は0であるため、親プロセスはブロックされる.サブプロセスがv操作を実行して信号量を追加するまで、親プロセスは操作できません.
次は実装コードです
解決方法:信号量メカニズムで、最初の信号量を0に初期化する
親プロセス:
ひりんかいいき
p(s)
りんかいいき
v(s)
ひりんかいいき
サブプロセス:
ひりんかいいき
v(s)
ひりんかいいき
これにより、親プロセスは臨界領域コードを実行する前にp操作を行うが、信号量は0であるため、親プロセスはブロックされる.サブプロセスがv操作を実行して信号量を追加するまで、親プロセスは操作できません.
次は実装コードです
#include
#include
#include
#include
#include
#include
/* */
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
/* */
int init_sem(int sem_id,int init_value);//
int del_sum(int sem_id);//
int sem_p(int sem_id);//P
int sem_v(int sem_id);//V
int main(){
pid_t result;
int sem_id;
/* */
sem_id = semget(ftok(".",'a'),1,0666|IPC_CREAT);
/* */
init_sem(sem_id,0);
/* fork */
result = fork();
if(result ==-1){
perror("fork
");
}else if(result ==0){//
printf("Child process will waite for some seconds.....
");
sleep(3);
printf("the return value is %d child process id is %d
",result,getpid());
sem_v(sem_id);
}else{//
sem_p(sem_id);
printf("the return value is %d father process id is %d
",result,getpid());
sem_v(sem_id);
}
exit(0);
}
//
int init_sem(int sem_id,int init_value){
union semun sem_union;
sem_union.val = init_value;
if(semctl(sem_id,0,SETVAL,sem_union)==-1){
perror("init semaphore");
return -1;
}
return 0;
}
//
int del_sem(int sem_id){
union semun sem_union;
if(semctl(sem_id,0,IPC_RMID,sem_union)==-1){
perror("delete semaphore");
return -1;
}
}
//p
int sem_p(int sem_id){
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op =-1;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1){
perror("P operation");
return -1;
}
return 0;
}
//v
int sem_v(int sem_id){
struct sembuf sem_b;
sem_b.sem_num =0;
sem_b.sem_op =1;
sem_b.sem_flg =SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1){
perror("V operation");
return -1;
}
return 0;
}