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:
同思路一,但當寫嘗試獲取鎖時,後續的讀請求將會掛起,而寫僅需等待目前未讀取完畢的任務。
- 問題:併發和效率低