信号量有关的同步问题
有限缓冲
1、分析需要的信号量个数
1
2
3
|
Binary semaphore mutex = 1;//互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n;//同步信号量,表示空闲缓冲区的数量
semaphore full = 0;//同步信号量,表示产品的数量,也即非空缓冲区的数量
|
2、类c代码
互斥信号量一定要放在同步信号量之后
复杂读者-写者
普通
1
2
3
4
|
int r_cnt = 0;
Semaphore
wrt = 1;
r_mutex = 1;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
writer(){
wait(wrt);
//w
signal(wrt);
}
reader(){
wait(r_mutex);
r_cnt++;
if(r_cnt == 1) wait(wrt);
signal(r_mutex);
//r
wait(r_mutex);
r_cnt--;
if(r_cnt == 0) signal(wrt);
signal(r_mutex);
}
|
带队列的读-写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Semaphore q = 1;
writer(){
wait(q);
//逻辑不变
signal(q);
}
reader(){
wait(q);
wait(r_mutex);
r_cnt++;
if(r_cnt == 1) wait(wrt);
signal(r_mutex);
signal(q); // 完成读计数之后就signal队列,之后你慢慢读没人管你
//r
wait(r_mutex);
r_cnt--;
if(r_cnt == 0) signal(wrt);
signal(r_mutex);
}
|
扩展的读写者问题——最多允许M个读者同时读

四出生之家
可扩展到更多水果,核心是处理第一个和最后一个,保证盘内品种唯一
哲学家吃屎
管程写法模板
1
2
3
4
5
6
|
Monitor M{
enum {THINKING, EATING, HUNGRY} states[5];
condition self[5];
// void ...
// void initialize();
}
|
(期中)计数范围
三状态最大、最小值:
可以都在waiting,但是最多时必须有cpus个进程在running,所以ready_max = total - cpus