2017-08-13 44 views
-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 
    }  
} 

這應該解決最大並行度的哲學家就餐問題,因爲畢竟一個哲學家已經獲得兩叉鎖被釋放。但會嗎?會有什麼活力問題嗎?我很困惑。

+1

當一個哲學家獲得一個互斥體並發現他的右叉被帶走時會發生什麼? 'take_fork'會失敗,從而導致左叉未釋放? –

+0

這應該是不可能的,因爲這個互斥體已經被其他一些哲學家壓倒了。 @DmitriChubarov –

回答

1

要回答你的問題,我想提供一些似乎將你的哲學家帶入不希望的狀態的事件。

考慮一個系統具有N> 2個哲學家博士(0),...中,Ph(N-1)和以下動作順序:

Ph(1).think(); 
Ph(0).think(); 
Ph(1).down(&mutex); 
Ph(1).take_fork(1); 
Ph(1).take_fork(2); 
Ph(1).up(&mutex); 
Ph(0).down(&mutex); 
Ph(0).take_fork(0); 
Ph(0).take_fork(1); 

回想fork(1)已經由Ph(1)獲取。現在取決於take_fork()的語義,可能會出現不同的行爲。

如果take_fork()如果無法獲取分支立即失敗,那麼fork(0)將永遠不會被釋放。

如果take_fork()掛起,直到資源釋放,則互斥永遠不會被釋放,並沒有其他的哲學家就能夠取得進展,因此只有一個哲學家會在同一時間吃。