-
大小: 3KB文件類型: .cpp金幣: 1下載: 0 次發(fā)布日期: 2023-12-04
- 語言: C/C++
- 標簽: 操作系統(tǒng)??
資源簡介
哲學家進餐問題的c++模擬實現(xiàn),避免死鎖的方法是奇數(shù)號哲學家先拿右邊的筷子,偶數(shù)號先那左邊的筷子,有詳盡的注釋。
代碼片段和文件信息
/*
哲學家進餐問題
規(guī)定:奇數(shù)號哲學家先拿起右邊筷子,然后再去拿左邊筷子,而偶數(shù)號哲學家相反
目的:防止死鎖
*/
#include
#include
#include
using?namespace?std;
#define?NUM?5??????????????//哲學家和筷子數(shù)目
mutex?mtx;
int?sequence[5];//用于保存進餐順序
int?m?=?0;
bool?chopstick[5]?=?{11111};//記錄型信號量
int?semaphore?=?5;//設置信號量
void?show()
{//顯示shopstick[]的狀態(tài)
mtx.lock();
for?(int?i?=?0;?i?5;?i++)
{
cout?< }
cout?< mtx.unlock();
}
void?P(int?i)
{
/*if?(chopstick[i]==0)
{//信號量小于0則中斷
this_thread::sleep_for(chrono::seconds(1));
}
else
{
chopstick[i]?=?0;//設置i號筷子為不可用
semaphore--;//信號量減一
}
*/
while?(chopstick[i]?==?0)
{//如果拿不到筷子就進入等待隊列
this_thread::sleep_for(chrono::seconds(1));
}
chopstick[i]?=?0;//設置i號筷子為不可用
semaphore--;//信號量減一
//show();
}
void?V(int?i)
{
chopstick[i]?=?1;//設置i號筷子為可用
semaphore++;
//show();
}
void?think(int?i)
{
cout?<}
void?eat(int?i)
{
mtx.lock();
cout?< mtx.unlock();
}
void?meal(int?i)
{
if?(i?%?2?==?0)???????????????//偶數(shù)號哲學家??
{
P(i);??//拿起左邊的筷子??
//mtx.lock();
????cout?< //mtx.unlock();
P((i?+?1)?%?5);//拿起右邊的筷子??
//mtx.lock();
????????????cout?< //mtx.unlock();
eat(i);??//左右都得到筷子則吃飯??
V(i);???//釋放左邊信號量??
評論
共有 條評論