⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 就餐.cpp

📁 关于哲学家就餐的问题,这只是个源码,我想要个课程设计形式的
💻 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 + -