0.哲学家就餐问题
解法之一:
- 有一个二元信号量用以避免操作的竞态条件
- 每个人有一个信号量用以标记所需叉子
- 每个人有状态 Thinking,Eating,Hungry
- 一个人可以吃,需邻居都不为Eating
#define N 5
#define LEFT (i+N-1)%N
#define RIGHT (i+1)%N
#define Thinking 0
#define Eating 1
#define Hungry 2
void take_forks(int i)
{
down(&mutex);
state[i] = Hungry;
test(i);
up(&mutex);
down(&s[i])
}
void put_forks(int i )
{
down(&mutex);
state[i] = Thinking;
test(LEFT);
test(RIGHT);
up(&mutex);
}
void test(int i)
{
if(state[i]==Hungry&&state[LEFT]!=Eating&&state[RIGHT]!=Eating){
state[i]=Eating;
up(&s[i]);
}
}
1.读者-写者问题
思路1:
读与写共享二元信号量db,读者获得锁时,读者可持续进入,而写获得锁时不可读,当无读者时释放锁。
- 问题:某些读者可能持续的进入,导致写需要等待很久,甚至永远不能写
思路2:
同思路一,但当写尝试获取锁时,后续的读请求将会挂起,而写仅需等待目前未读取完毕的任务。
- 问题:并发和效率低