-1
這個僞代碼可以解決用餐哲學家最大平行度問題嗎?這裏mutex
是一個二進制信號量,初始化爲1.叉假定從0到(N-1)編號。總共有N位哲學家編號從0到(N-1)。餐飲哲學家使用二元信號量
void philosopher(int i) // ith philosopher
{
while (true)
{
think();
down(&mutex); // acquire lock
take_fork(i); // take left fork
take_fork((i+1)%N); // take right fork
up(&mutex); // release the lock
eat();
down(&mutex); // acquire lock
put_fork(i);
put_fork((i+1)%N);
up(&mutex); // release the lock
}
}
這應該解決最大並行度的哲學家就餐問題,因爲畢竟一個哲學家已經獲得兩叉鎖被釋放。但會嗎?會有什麼活力問題嗎?我很困惑。
當一個哲學家獲得一個互斥體並發現他的右叉被帶走時會發生什麼? 'take_fork'會失敗,從而導致左叉未釋放? –
這應該是不可能的,因爲這個互斥體已經被其他一些哲學家壓倒了。 @DmitriChubarov –