问题描述:
- 一个或多个生产者在生产数据后放在一个缓冲区中
- 单个消费者从缓冲区中取数据处理
- 任何时刻只能有一个生产者或消费者可访问缓冲区
用信号量来解决 生产者——消费者问题
问题分析:
-
任何时刻只能有一个线程操作缓冲区 (互斥访问)
-
缓冲区空时,消费者必须等待生产者 (条件同步)
-
缓冲区满时,生产者必须等待消费者 (条件同步)
解决方法:
- 二进制信号量 mutex (互斥访问)
- 资源信号量 fullBuffers (条件同步)
- 资源信号量 emptyBuffers (条件同步)
设置缓冲区
Class BoundedBuffer{
mutex = new Semaphore(1);
fullBuffers = new Semaphore(0); // 初始缓冲池为空,fullBuffers 相当于当前资源的数量
emptyBuffers = new Semaphore(n); // 初始缓冲区为空,emptyBuffers 相当于空闲的位置
}
- 我们先实现互斥访问缓冲区
生产者
ADD(Resource r){
mutex -> p();
Add r to the buffer;
mutex -> v();
}
消费者
Remove(Resource r){
mutex -> p();
remove r from buffer;
mutex -> v();
}
- 解决缓冲区空的问题
生产者
ADD(Resource r)