生产者消费者问题
对于缓冲区而言是互斥的,同一时刻只能由一个进程完成生产或消费(缓冲区是临界资源,各进程必须互斥的访问)
生产者、消费者共享一个初始为空、大小为n的缓冲区。
只有缓冲区没满时,生产者才能把产品放进缓冲区,否则必须等待。
只有缓冲区不空时,消费者才能从中取出产品,否则等待。
1 | semaphore mutex = 1; // 互斥信号量,实现对缓冲区的互斥访问 |
注意:顺序不能颠倒
- P(empty); V(empty);是实现消费产品之后,对空闲缓冲区的数目实现进程的同步,因此在消费者最后执行V操作,在生产者最前面进行P操作。
- P(full); V(full);是实现生产产品之后,对产品的的数目的实现进程同步,因此在生产者最后执行V操作,在消费者最前面进行P操作。
- P(mutex);V(mutex);实现对缓冲区临界资源的互斥访问。
问题
这里如果交换了两个P的位置,那么可能先拿到了互斥锁,此时发现商品满的,不需要上商品,阻塞了,但是互斥锁还在手里。消费者就没法消费了,那么就死锁了,永远没人来消费。
如果交换两个V的位置,不会死锁,但是锁的粒度增大,会导致运行效率低。