資源簡介
操作系統中4類經典同步問題實驗。Windows下,包括4個C++代碼:生產者與消費者 、讀者和寫者 、哲學家問題 、理發師問題和1份實驗報告

代碼片段和文件信息
//?哲學家1.cpp?:?定義控制臺應用程序的入口點。
//
#include?“stdafx.h“
#include?
#include?
#include?
#include??
#include???
using?namespace?std;???????????????????
const?unsigned?int?PHILOSOPHER_NUM=5;????//哲學家數目
const?char?THINKING?=?1;???????????????????//?標記當前哲學家的狀態1表示等待2表示得到饑餓3表示正在吃飯
const?char?HUNGRY?=?2;
const?char?DINING?=?3;
HANDLE?hPhilosopher[5];??????????????????//定義數組存放哲學家
HANDLE?semaphore[PHILOSOPHER_NUM];???????//?semaphore?用來表示筷子是否可用
HANDLE?mutex;????????????????????????????//?Mutex用來控制安全輸出
DWORD?WINAPI?philosopherProc(?LPVOID?lpParameter)???????//返回?DWORD(32位數據)的?API?函數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?<“哲學家?“?< ReleaseMutex(mutex);
mystate?=?THINKING;??????????????????????????????????????//初始狀態為THINKING
leftFork?=?(myid)?%?PHILOSOPHER_NUM;
rightFork?=?(myid?+?1)?%?PHILOSOPHER_NUM;
while?(true)
{
switch(mystate)
{
case?THINKING:
mystate?=?HUNGRY;??????????????????????????????????????//?改變狀態
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;???????????????????????????????????//?右筷子可用,就改變自己的狀態
strcpy(stateStr?“DINING“);
}
else
{
ReleaseSemaphore(semaphore[leftFork]?1?NULL);?????//?如果右筷子不可用,就把左筷子放下
}
}
break;
case?DINING:
//?吃完后把兩支筷子都放下
ReleaseSemaphore(semaphore[leftFork]?1?NULL);
ReleaseSemaphore(semaphore[rightFork]?1?NULL);
mystate?=?THINKING;???????????????????????????????????//?改變自己的狀態
strcpy(stateStr?“THINKING“);
break;
}
//?輸出狀態
WaitForSingleobject(mutex?INFINITE);
cout?<“哲學家?“?< 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()
{
cout<<“***************\t\t哲學家就餐\t\t*****************“< cout<<“***************\t\t輸入\t\t*****************“< cout<<“5位哲學家“< cout<<“***************\t\t輸出\t\t*****************“< 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);
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????394869??2017-06-10?00:25??151002423魏恒\151002423魏恒.doc
?????文件???????3216??2017-06-08?21:44??151002423魏恒\哲學家就餐問題.cpp
?????文件???????4013??2017-06-09?13:22??151002423魏恒\理發師問題.cpp
?????文件???????5654??2017-06-09?13:50??151002423魏恒\生產者和消費者.cpp
?????文件???????3189??2017-06-08?21:42??151002423魏恒\讀者和寫者.cpp
?????目錄??????????0??2017-06-10?00:27??151002423魏恒
-----------?---------??----------?-----??----
???????????????410941????????????????????6
評論
共有 條評論