設有5個哲學家。
哲學家就餐問題的解決需要用到條件變數和互斥鎖,
另外,哲學家應該有3個狀態:hungry,thinking,eating。宣告哲學家變數如下:
執行緒的建立不再贅述。
哲學家執行緒如下:
pickup_forks()函式具體如下:
其中,test()函式是哲學家在試圖拿起刀叉,定義如下
在test函式中,只有當哲學家左右邊的餐具都可用(即在緊靠著他左右側的兩位科學家都不在進食狀態),且其已經進入飢餓狀態的時候,哲學家才會拿起餐具,進入進食狀態。
哲學家在進食完成後,會呼叫return_forks()函式,其具體定義如下:
該函式讓進食完成的哲學家重新進入思考狀態,並且通知在他左鄰座和右鄰座的哲學家他已經進食完成,餐具已經歸還。通知這個操作仍然通過test()函式實現,當通知的物件(哲學家)滿足進餐要求時,即會呼叫pthread_cond_signal(&self[p_n]),此時會喚醒「擁有」self[p_n]的執行緒,pthread_cond_wait()會重新獲得mutex鎖。
pthread_cond_wait()函式的作用:pthread_cond_wait()在條件不成立時會讓執行緒進入阻塞,然後其會釋放mutex鎖,使得其他執行緒能夠去獲得這個mutex鎖,當有執行緒呼叫相同的pthread_cond_t物件的pthread_cond_signal(),原先阻塞的執行緒就會被喚醒,且pthread_cond_wait()會幫助該執行緒重新獲得mutex鎖。
哲學家就餐問題
本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...
哲學家就餐問題
pragma once include include include include include include include include include include include include include stdafx.h handle chopstick 5 room l...
哲學家就餐問題
假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一 吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手邊的那兩隻餐叉。哲學家就餐問...