司机售票员问题
同步问题
经典同步问题
消费者一开始需要一个批复操作,去申请放产品,但是一开始buffer是空的。
当生产者将产品放入buffer之后,生产者要向等待的消费者发送一个通知,提醒他们可以取消费者了。
buffer为空时,通知生产者要生产了,buffer满的时候,通知生产者停止生产
但缓冲解决
生产者放一个进入buffer,消费者从buffer里面拿一个。
我们将empty设置为5,可以发现可以同时允许五个用户进行取操作
这个模型叫做有界缓冲区
循环缓冲区
上面这个缓冲区是有界的,那么如果我们要利用这个缓冲区存放更多的数据的话,那么我们需要让这个区域可以反复存取
我们设现在又六个产品需要存储(期间用户一直在取)。
我们发现到in到6的时候超出了下标
那么我们则可以用取余的办法去做
因为用户取的程序也是并发的那么我们取一个也是要前移,由于是循环,我们也需要取余
有界buffer的问题
这里可以看到如果生产者是并发放产品,那么中间会有个临界区,且这里没有原子操作
这里是个互斥问题
如果p(empty)和p(mutex)互换
我们这里可以看到互换之后如果是生产者先执行那么问题并不大,如果是消费者先执行,那么到达p(full)这里会一直等待,但是如果这个进程一直占用空间,那么生产者产生的进程又会一直等待,这里就是个死锁。
我们可以看到
同步信号量和互斥信号量在同一个进程,互斥信号量不能包含同步信号量
苹果桔子问题
先设置初始状态
后面我们直接实验