📄 就餐.cpp
字号:
//哲学家就餐问题的解法
#include "windows.h"
#include <process.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
const unsigned int PHILOSOPHER_NUM=5;
const char THINKING=1;
const char HUNGRY=2;
const char DINING=3;
HANDLE hPhilosopher[5];
// semaphore 用来表示筷子是否可用
HANDLE semaphore[PHILOSOPHER_NUM];
// Mutex用来控制安全输出
HANDLE mutex;
DWORD WINAPI philosopherProc( LPVOID lpParameter)
{
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 " << myid << " begin......" << endl;
ReleaseMutex(mutex);
//初始状态为THINKING
mystate = 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 << "philosopher " << myid << " is : " << stateStr << endl;
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<PHILOSOPHER_NUM; i++)
{
semaphore[i] = CreateSemaphore(NULL, 1, 1, NULL);
hPhilosopher[i]=CreateThread(NULL,0,philosopherProc,LPVOID(i), CREATE_SUSPENDED,0);
}
for (i=0; i<PHILOSOPHER_NUM; i++)
ResumeThread(hPhilosopher[i]);
Sleep(2000);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -