生产者-消费者问题
问题描述
- 一个共享的缓冲区
- 缓冲区必须为临界资源,否则可能出现多个生产者进程向同一块内存中写入数据的情况
- 生产者向缓冲区中写入数据,当缓冲区满时无法写入,生产者进入等待
- 消费者从缓冲区中读出数据,当缓冲区为空时无法读取,消费者进入等待

步骤

问题分析
<aside>
💡 思路:设置两个同步信号量与一个互斥信号量
</aside>


实现

注意
<aside>
💡 P操作顺序不可互换:实现互斥的P操作一定要在实现同步的P操作之后
</aside>
- 一定要先完成缓冲区操作再对mutex上锁,否则如果出现进程切换,会出现死锁
- 顺序互换后发生死锁的例子:假设一个时刻空闲缓冲区为0,且生产者先执行:
- 生产者持有mutex,但由于没有空闲缓冲区所以在P(empty)处等待消费者增加空闲缓冲区
- 消费者在P(mutex)处等待生产者释放mutex,所以无法增加空闲缓冲区
- 发生了死锁
<aside>
💡 V操作顺序可互换,因为V操作不会导致进程阻塞
</aside>
- 消费者使用产品最后放在对临界区操作完成后,使得对临界区的操作时间尽可能短
多生产者-多消费者问题