问题分析
1. 分析关系
同步关系:
互斥关系:
2. 整理思路
同步关系的P、V操作:
互斥关系的P、V操作:
3. 信号量初值设置
同步信号量:
信号量full用于记录当前缓冲池中的“满”缓冲区数,初值为0。
信号量empty用于记录当前缓冲池中的“空”缓冲区数,初值为n。
互斥信号量:
信号量mutex作为互斥信号量,用于控制互斥访问缓冲池,互斥信号量初值为1;
代码
semaphore mutex=l; //临界区互斥信号量
semaphore einpty=n; //空闲缓冲区
semaphore full=0; //缓冲区初始化为空
producer(){ //生产者进程
while(1){
produce an item in nextp; //生产数据
P (empty);(要用什么,P—下) //获取空缓冲区单元
P (mutex);(互斥夹紧) //进入临界区
add nextp to buffer;(行为) //将数据放入缓冲区
V (mutex);(互斥夹紧) //离开临界区,释放互斥信号量
V(full);(提供什么,V—下) //满缓冲区数加1
}
}
consumer(){ //消费者进程
while (1){
P(full); //获取满缓冲区单元
P(mutex); //进入临界区
remove an item from buffer; //从缓冲区中取出数据
V(mutex); //离开临界区,释放互斥信号量
V(empty); //空缓冲区数加1
consume the item; //消费数据
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
同步和互斥的顺序能否调换顺序?
类比:
2. 多生产者——消费者问题
问题描述:桌子上有一个盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈