文档介绍:
(1)读者写者问题
有两组并发进程:
读者和写者,共享一组数据区
要求:
允许多个读者同时执行读操作
不允许读者、写者同时操作
不允许多个写者同时操作
第一类:读者优先
如果读者来:
1)无读者、写者,新读者可以读
2)有写者等,但有其它读者正在读,则新读者也可以读
3)有写者写,新读者等
如果写者来:
1)无读者,新写者可以写
2)有读者,新写者等待
3)有其它写者,新写者等待
第一类读者写者问题的解法
读者:
while (true) {
P(mutex);
readcount ++;
if (readcount==1)
P (w);
V(mutex);
读
P(mutex);
readcount --;
if (readcount==0)
V(w);
V(mutex);
};
写者:
while (true) {
P(w);
写
V(w);
};
第一类读者写者问题的解法(一般信号量集)
读者:
Swait(wmutex,1,1;
rcount,R,0);
写;
Ssignal(wmutex,1);
写者:
Swait(rcount,1,1;
wmutex,1,0);
写;
Ssignal(rcount,1);
增加一个限制条件:同时读的“读者”最多R个
Wmutex表示“允许写”,初值是1
Rcount表示“允许读者数目”,初值为R
(2)哲学家就餐问题
有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子
每个哲学家的行为是思考,感到饥饿,然后吃通心粉
为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子
#define N 5
void philosopher (int i) {
while (true) {
思考;
取fork[i]; 取fork[(i+1) % 5];
进食;
放fork[i]; 放fork[(i+1) % 5];
}
}
为防止死锁发生可采取的措施:
最多允许4个哲学家同时坐在桌子周围
仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子()
给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之
为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,并且一次拿到两只筷子,否则不拿
哲学家就餐问题解法(1)
#define N 5
void philosopher (int i) {
while (true) {
思考;
取fork[i]; 取fork[(i+1) % 5];
进食;
放fork[i]; 放fork[(i+1) % 5];
}
}
哲学家就餐问题解法(2)
#define N 5
#define THINKING 0
#define HUNGRY 1
#define EATING 2
#typedef int semaphore;
int state[N];
semaphore mutex=1;
semaphore s[N];
void test(int i)
{
if (state[ i ] == HUNGRY)
&& (state [ (i-1) % 5] != EATING)
&& (state [ (i+1) % 5] != EATING)
{
state[ i ] = EATING;
V(&s[ i ]);
}
}