资源简介

操作系统中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 << “哲学家 “ << myid << “ 开始......“ << 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 << “哲学家 “ << myid << “ 是 : “ << 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()
{
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


评论

共有 条评论