父、子进程访问共享变量,变量得不到正确更新。。求解答?!
RT.
大意为父、子进程各将count的值加1,但最终count只加了1.
semWait和semSignal之间为临界区,count只在临界区中访问,却得不到正确修改?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int count;/* 共享变量 */
int semWait(int semid)/* 申请信号量 */
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = SEM_UNDO;
if (semop(semid, &sem_b, 1) == -1)
{
printf("semWait error!\n");
return 0;
}
return 1;
}
int semSignal(int semid)/* 释放信号量 */
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = 1;
sem_b.sem_flg = SEM_UNDO;
if (semop(semid, &sem_b, 1) == -1)
{
printf("semSignal error!\n");
return 0;
}
return 1;
}
void addCount(int semid, int id)
{
printf("id = %d, waiting for:\n",id);
semWait(semid);
printf("id = %d, comes in\n",id);
printf("id = %d, count = %d\n",id,count);
count++;
printf("id = %d, count = %d\n",id,count);
semSignal(semid);
sleep(3);
printf("id = %d, quit\n",id);
}
void main()
{
count = 0;
int semid = semget(ftok(".",0), 1, IPC_CREAT|0600);/* 创建信号量 */
if (semid == -1)
{
printf("semctl error!\n");
exit(-1);
}
semctl(semid, 0, SETVAL, 1);/* 初始化信号量 */
int pid = fork();
if (pid == 0)/* 子进程 */
{
addCount(semid, 2);
}
else
{
addCount(semid, 1);/* 父进程 */
printf("parent ends!\n");
wait(NULL);
printf("child ends!\n");
semctl(semid, 0, IPC_RMID, 0);/* 删除信号量 */
printf("count = %d\n",count); /* 预期count为2,结果为1 */
}
}