生产者-消费者问题
问题分析
存在前驱关系:缓冲区没满生产者才能生产,缓冲区没空,消费者才能消费
缓冲区需要互斥访问的原因主要有以下几点:
- 避免数据竞争:当多个线程或进程同时访问同一个缓冲区时,如果不加以控制,就可能出现一个线程正在读取数据而另一个线程却正在写入数据的情况。这种并发的访问会导致数据的不一致性和不可预测性。
- 防止死锁:如果生产者或消费者在没有可用缓冲区的情况下仍然保持对缓冲区的占用,可能会导致系统进入死锁状态,即多个进程互相等待对方释放资源,无法继续执行。
- 防止内存泄露:对于动态分配在堆上的缓冲区,如果不正确地管理访问权限,可能会导致内存泄露,因为缓冲区可能永远不会被释放回系统。
- 保护临界区:通过设置互斥信号量(如mutex),并确保在访问缓冲区的临界区内只有一个线程可以执行,可以有效地保护共享资源。
如何实现
思考:能否改变相邻的P,V操作的顺序
会出现死锁的问题
producer中生产一个产品和consumr中使用一个产品放入临界区的话会增长使用临界区的时间,上锁时间较长,不利于各个进程对临界区的交替使用(但放进去逻辑来说没问题)
小结
注意互斥是先P后V,同步是先V后P
多生产者-多消费者问题
多:指的是多类生产者与消费者的关系
问题分析
找互斥关系和同步关系(一前一后)
如何实现
如果不用互斥信号量?
由于apple orange plate三个同步信号量不可能存在两个或三个为1,因为盘子只能放一个水果,且只有一个盘子
当缓冲区为2的时候,此时可能存在两个同时访问缓冲区的进程
小结
死锁:都卡在第一个申请互斥访问的函数上
即事件需要从多个进程中概括提取出来,进而简化关系