资源简介
操作系统中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语言实现
- 操作系统基本分页存储系统
- 操作系统实验报告处理机调度算法的
- 安徽大学操作系统实验九最终考试内
- 动态分区分配方式的模拟
- 操作系统电梯调度算法
- nachos操作系统实验三
- 用C\\C++实现操作系统经典同步问题,
- NUR算法和OPT算法实现-----操作系统实验
- 操作系统模拟实现单级目录的文件系
- FCFS和SJF调度算法C++
- 进程同步操作系统实验三,带实验报
- 操作系统的理发师问题解决文件打包
- 操作系统调度算法c语言实现
- 操作系统实验-计算机进程管理和进程
- 操作系统课程设计之进程调度源代码
- 操作系统 动态分区存储管理方式的
- 《 Linux操作系统下C语言编程入门》
- 操作系统内存分配C++实现
- 操作系统 读者写者问题c++
- 操作系统实习-快速文件系统
- 操作系统实习:动态分区分配C++实现
- 操作系统c语言模拟作业调度实验
- 进程调度时间片轮转+优先级进程调度
- 操作系统课程设计 文件管理系统模拟
- spooling模拟系统代码.docx
- 操作系统实验-----MFC线程--购票系统演
评论
共有 条评论