資源簡介
設(shè)有五個哲學(xué)家,共用一張放有五把椅子的餐桌,每人坐在一把椅子上,桌子上有五個碗和五只筷子,每人兩邊各放一只筷子。哲學(xué)家們是交替思考和進(jìn)餐,饑餓時便試圖取其左右最靠近他的筷子。條件:
(1) 只有拿到兩只筷子時,哲學(xué)家才能吃飯。
(2) 如果筷子已被別人拿走,則必須等別人吃完之后才能拿到筷子。
(3) 任意一個哲學(xué)家在自己未拿到兩只筷子吃飯前,不會放下手中拿到的筷子。

代碼片段和文件信息
#include?
#include?
#include??
#include??
#include??
#include?
using?namespace?std;?????????????????????//命名空間std內(nèi)定義的所有標(biāo)識符都有效
const?unsigned?int?PHILOSOPHER_NUM=5;????//哲學(xué)家數(shù)目
const?char?THINKING=1;???????????????????/*標(biāo)記當(dāng)前哲學(xué)家的狀態(tài)1表示等待2表示得到饑餓3表示正在吃飯*/
const?char?HUNGRY=2;
const?char?DINING=3;
HANDLE?hPhilosopher[5];??????????????????//定義數(shù)組存放哲學(xué)家
?????????????????????????????????????????/*HANDLE(句柄)是windows操作系統(tǒng)中的一個概念。指的是一個核心對象在某一個進(jìn)程中的唯一索引*/
HANDLE?semaphore[PHILOSOPHER_NUM];???????//?semaphore?用來表示筷子是否可用
HANDLE?mutex;????????????????????????????//?Mutex用來控制安全輸出
DWORD?WINAPI?philosopherProc(?LPVOID?lpParameter)???????//返回?DWORD(32位數(shù)據(jù))的?API?函數(shù)philosopherProc
{
?int??myid;
?char?idStr[128];
?char?stateStr[128];
?char?mystate;
?int??ret;
?unsigned?int?leftFork;??????????????????//左筷子
?unsigned?int?rightFork;?????????????????//右筷子
?myid?=?int(lpParameter);
?itoa(myid?idStr?10);
?
?WaitForSingleobject(mutex?INFINITE);
??cout?<“philosopher?“?<??ReleaseMutex(mutex);
?mystate?=?THINKING;??????????????????????????????????????//初始狀態(tài)為THINKING
?leftFork?=?(myid)?%?PHILOSOPHER_NUM;
?rightFork?=?(myid?+?1)?%?PHILOSOPHER_NUM;
?while?(true)
?{
??switch(mystate)
??{
??case?THINKING:
???mystate?=?HUNGRY;??????????????????????????????????????//?改變狀態(tài)
???strcpy(stateStr?“HUNGRY“);?
???break;
??case?HUNGRY:
???strcpy(stateStr?“HUNGRY“);
???ret?=?WaitForSingleobject(semaphore[leftFork]?0);????//?先檢查左筷子是否可用
???if?(ret?==?WAIT_object_0)
???{???
????ret?=?WaitForSingleobject(semaphore[rightFork]?0);??//左筷子可用就拿起,再檢查右筷子是否可用?
????if?(ret?==?WAIT_object_0)
????{
?????mystate?=?DINING;???????????????????????????????????//?右筷子可用,就改變自己的狀態(tài)
?????strcpy(stateStr?“DINING“);
????}
????else
????{
?????ReleaseSemaphore(semaphore[leftFork]?1?NULL);?????//?如果右筷子不可用,就把左筷子放下
????}
???}
???break;
??case?DINING:
???//?吃完后把兩支筷子都放下
???ReleaseSemaphore(semaphore[leftFork]?1?NULL);
???ReleaseSemaphore(semaphore[rightFork]?1?NULL);
???mystate?=?THINKING;???????????????????????????????????//?改變自己的狀態(tài)
???strcpy(stateStr?“THINKING“);
???break;
??}
??//?輸出狀態(tài)
??WaitForSingleobject(mutex?INFINITE);
??cout?<“philosopher?“?<??ReleaseMutex(mutex);
??
??//?sleep?a?random?time?:?between?1?-?5?s
??int?sleepTime;?
??sleepTime?=?1?+?(int)(5.0*rand()/(RAND_MAX+1.0));?
??Sleep(sleepTime*10);
?}
}
int?main()
{
?int?i;
?srand(time(0));
?mutex?=?CreateMutex(NULL?false?NULL);
?for?(i=0;?i ?{
??semaphore[i]?=?CreateSemaphore(NULL?1?1?NULL);
??hPhilosopher[i]=CreateThread(NULL0philosopherProcLPVOID(i)?CREATE_SUSPENDED0);??
?}
??for?(i=0;?i ??ResumeThread(hPhilosopher[i]);
?Sleep(2000);
?return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????177664??2011-09-05?20:01??操作系統(tǒng)課程設(shè)計報告.doc
?????文件???????3129??2011-09-07?18:27??philosopher.cpp
-----------?---------??----------?-----??----
???????????????180793????????????????????2
評論
共有 條評論