资源简介
操作系统中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
相关资源
- 操作系统c语言模拟文件管理系统844
- 操作系统课设 读写者问题 c语言实现
- ROS操作系统入门讲义
- Linux操作系统下C语言编程从零开始
- 操作系统存储管理实验报告c/c++
- 操作系统课程设计(银行家算法)附
- 现代操作系统第三版高清
- C++操作系统课设-进程管理
- 哲学家进餐问题的c++模拟实现
- 操作系统课程设计(生产者-消费者存
- 操作系统——5个实验.zip
- 操作系统进程管理实验
- 操作系统—页面置换算法C++实现
- 操作系统 内存管理 模拟 图形界面
- 银行家算法 mfc 含源代码 界面 操作系
- 操作系统生产者消费者问题MFC动态实
- 操作系统课程设计:Windows 命令接口之
- 操作系统课程大作业-文件管理系统
- C语言实现最低松弛度优先算法源代码
- 操作系统信号量PV经典问题:沉睡的理
- 基于C++的银行家算法模拟实现
- 生产者消费者问题源码-MFC实现-进程模
- 操作系统实验 进程调度 高响应比优先
- 操作系统文件管理C++代码实现
- 嗜睡的理发师进程同步与实现c++
- 安徽大学操作系统实验八基于扫描的
- 安徽大学操作系统实验四主存空间的
- 操作系统——银行家算法
- 操作系统_生产者消费者c++、mfc实现
- 磁盘调度c++模拟实现计算机操作系统
评论
共有 条评论