记录型信号量解决生产消费者问题,缓冲区为什么要互斥访问

就是下面这段代码如果不要mutex信号量会有什么问题

int in = 0, out = 0;//in: 输入指针, out: 输出指针;
item buffer[n];//n个缓冲区组成的数组;
semaphore mutex = 1, full = 0, empty = n;
//mutex: 互斥信号量, 生产者进程和消费者进程都只能互斥访问缓冲区;
//full: 资源信号量, 满缓冲区的数量;
//empty: 资源信号量, 空缓冲区的数量;//信号量不允许直接参与运算, 故都要定义;

//生产者程序;
void Producer() {
do {
生产者生产一个产品nextp;
wait(empty);//申请一个空缓冲区;
wait(mutex);//申请临界资源;
buffer[in] = nextp;//将产品添加到缓冲区;
in = (in + 1) % n;//类似于循环队列;
signal(mutex);//释放临界资源;
signal(full);//释放一个满缓冲区;
} while (TRUE);
}

//消费者程序;
void Producer() {
do {
wait(full);//申请一个满缓冲区;
wait(mutex);//申请临界资源;
nextc = buffer[out];//将产品从缓冲区取出;
out = (out + 1) % n;//类似于循环队列;
signal(mutex);//释放临界资源;
signal(empty);//释放一个空缓冲区;
消费者将一个产品nextc消费;
} while (TRUE);
}

也有可以不用互斥的使用缓冲池的情况:缓冲池的容量为1。如果缓冲池容量不为1,那么就需要用指针in,out顺序访问缓冲池。而in指针或out指针会被多个生产者或消费者访问修改,如果不互斥访问,由进程异步性会导致in out指针的不确定性结果。
参考西安电子科技大学出版社的第4版操作系统学习指导p45和p24页
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答