资源简介

设有五个哲学家,共用一张放有五把椅子的餐桌,每人坐在一把椅子上,桌子上有五个碗和五只筷子,每人两边各放一只筷子。哲学家们是交替思考和进餐,饥饿时便试图取其左右最靠近他的筷子。条件: (1) 只有拿到两只筷子时,哲学家才能吃饭。 (2) 如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。 (3) 任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。

资源截图

代码片段和文件信息

#include 
#include 
#include  
#include  
#include  
#include 

using namespace std;                     //命名空间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(句柄)是windows操作系统中的一个概念。指的是一个核心对象在某一个进程中的唯一索引*/

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 << “philosopher “ << myid << “ begin......“ << endl;
  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 << “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 {
  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  操作系统课程设计报告.doc

     文件       3129  2011-09-07 18:27  philosopher.cpp

----------- ---------  ---------- -----  ----

               180793                    2


评论

共有 条评论