c实现哲学家进餐问题。WINDOWS下。
// 解决哲学家就餐问题
// 每个哲学家可用一个线程来模拟。
// 设有5个哲学家,5只筷子,每个哲学家吃饭时间为一个随机值,哲学家吃饭后的思考时间也是一个随机值。
#include <Windows.h>
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <time.h>
/*
(1)奇数号的哲学家先拿起右边的筷子再拿起左边的筷子。
(2)偶数号哲学家先拿起左边的筷子,再拿起右边的筷子。
(3)如果哲学家抢到一只筷子,在抢占另一只筷子时失败,则要放弃已经抢占到的资源。
(4)左右两边都抢到筷子的哲学家,吃完放后释放资源。*/
using namespace std;
HANDLE chop[5];
HANDLE ph[5];
HANDLE mutex;
int nums=0;
int random()
{
return rand()%100+20;
}
void eating(int id)
{
int num=random();
Sleep(num);
printf("\t\t\t哲学家%d号吃了%d秒\n",id,num);
}
DWORD WINAPI phthread(LPVOID param){
nums++;
int id=nums;
int lc=id-1;
int rc=id%5;
int times=0;
int ret1,ret2;
while(true)
{
Sleep(100);
if (times>=2)
break;
if (id % 2 == 0)
{
ret1 = WaitForSingleObject(chop[lc], 0);
if (ret1 == WAIT_OBJECT_0)
{
ret2 = WaitForSingleObject(chop[rc], 0);
if (ret2 == WAIT_OBJECT_0)
{
WaitForSingleObject(mutex,INFINITE);
printf("哲学家%d号拿到两只筷子开始吃第%d顿饭。\n", id,times+1);
ReleaseMutex(mutex);
times++;
WaitForSingleObject(mutex,INFINITE);
eating(id);
ReleaseMutex(mutex);
WaitForSingleObject(mutex,INFINITE);
printf("\t\t\t哲学家%d号吃完两顿饭啦,放下筷子。\n", id);
ReleaseMutex(mutex);
ReleaseSemaphore(chop[rc], 1, NULL);
}
ReleaseSemaphore(chop[lc], 1, NULL);
}
}
else
{
ret1 = WaitForSingleObject(chop[rc], 0);
if (ret1 == WAIT_OBJECT_0)
{
ret2 = WaitForSingleObject(chop[lc], 0);
if (ret2 == WAIT_OBJECT_0)
{
WaitForSingleObject(mutex,INFINITE);
printf("哲学家%d号拿到两只筷子开始吃%d顿饭。\n", id,times+1);
ReleaseMutex(mutex);
times++;
WaitForSingleObject(mutex,INFINITE);
eating(id);
ReleaseMutex(mutex);
WaitForSingleObject(mutex,INFINITE);
printf("\t\t\t哲学家%d号吃完两顿饭啦,放下筷子。\n", id);
ReleaseMutex(mutex);
ReleaseSemaphore(chop[lc], 1, NULL);
}
ReleaseSemaphore(chop[rc], 1, NULL);
}
}
WaitForSingleObject(mutex,INFINITE);
ReleaseMutex(mutex);
}
printf("=======哲学家%d吃饱了然后离开了。=======\n",id);
return 0;
}
int main()
{
srand((unsigned)time(0));
mutex = CreateMutex(NULL, false, NULL);
for (int i = 0; i < 5; ++i)
{
chop[i]=CreateSemaphore(NULL,1,1,NULL);
}
for (int i = 0; i < 5; ++i)
{
int j = i + 1;
ph[i] = CreateThread(NULL, 0, phthread,NULL, 0, NULL);
}
Sleep(10000);//释放句柄
for (int i = 0; i < 5; ++i)
{
CloseHandle(ph[i]);
CloseHandle(chop[i]);
}
CloseHandle(mutex);
Sleep(500);
system("pause");
return 0;
}
c实现哲学家进餐问题。WINDOWS下。的更多相关文章
- 利用Linux下的pthread_mutex_t类型来实现哲学家进餐问题
首先说一下什么是哲学家进餐问题,这是操作系统课程中一个经典的同步问题, 问题如下:如上图,有6个哲学家和6根筷子(那个蓝色部分表示哲学家,那个紫色长条部分表示筷子),他们分别被编了0~5的号!如果某个 ...
- 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)
相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...
- 让 windows 下的命令行程序 cmd.exe 用起来更顺手
在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...
- Windows下Visual studio 2013 编译 Audacity
编译的Audacity版本为2.1.2,由于实在windows下编译,其源代码可以从Github上取得 git clone https://github.com/audacity/audacity. ...
- Windows下Nginx配置SSL实现Https访问(包含证书生成)
Vincent.李 Windows下Nginx配置SSL实现Https访问(包含证书生成) Windows下Nginx配置SSL实现Https访问(包含证书生成) 首先要说明为什么要实现https ...
- 关于Linux和Windows下部署mysql.data.dll的注册问题
mysql ado.net connector下载地址: http://dev.mysql.com/downloads/connector/net/ 选择版本: Generally Available ...
- windows下配置apache+php环境
PHP安装 由于windows下php扩展5.6的多余7.0,故以php5.6为开发环境.如果对扩展要求不高,可以使用php7,安装过程类似. 约定: 环境安装目录: D:/phpsetup/ |-- ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- Windows下PowerShell监控Keepalived
一.背景 某数据库服务器为CentOS,想要监控Keepalived的VIP是否有问题,通过邮件进行报警,但这台机器不能上外网,现在只能在Windows下通过PowerShell来完成发邮件预警. 二 ...
- Windows下构建ASP.NET Core+Code First+Docker
背景介绍 本文将会示范如何在Windows系统下基于ASP.NET Core构建跨平台服务,并通过Docker容器运行发布. 首先说一下为什么选择这一套组合: 我本人和我们Code4Thought团队 ...
随机推荐
- 实现Qt日志功能并输出到文件(使用qInstallMsgHandler安装customMessageHandler)good
原文 http://www.cppblog.com/lauer3912/archive/2011/04/10/143870.html 一.基本分类:qDebug : 调试信息提示qWarning: 一 ...
- 屏蔽按CapsLock键切换到大写时,编辑框自动弹出的提示(UnregisterClass(TOOLTIPS_CLASS)后,重新设置WndProc并注意返回值)
WNDPROC OldProc; LPCTSTR lpStr = TEXT("保持大写锁定打开可能会使您错误输入密码"); LRESULT CALLBACK WindowProc( ...
- http 报错码对应的错误原因
转:http://blog.csdn.net/cutbug/article/details/4024818 1xx - 信息提示这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多 ...
- python自动化测试之mysql5.0版本数据库查询数据时出现乱码问题分析
1.确保数据库编码是utf8编码.若不是,请将my.ini的client,mysql,mysqld三个字段下面添加default-character-set = utf8,这样可以永久改变在新建数据库 ...
- C++虚函数与虚表
有一定面向对象知识的朋友对继承与多态一定很熟悉,C++想实现继承的话就要使用虚函数,那么什么是虚函数,其原理是什么,下面尽量给大家分析一下C++中其运行机制: 首先,基础,什么是虚函数,什么是多态? ...
- ssm中mapper注入失败的传奇经历
最近因为要测试一个功能,需要用最短的时间来启动服务,开启测试程序,但平常所用的框架中已经集成了各种三方的东西,想着那就再重新搭建一个最简单的ssm框架吧. 搭建可参考:简单ssm最新搭建 搭建过程并不 ...
- CPP常用库函数以及STL
其他操作 memset void * memset ( void * ptr, int value, size_t num ); memset(ptr,0xff,sizeof(ptr)); 使用mem ...
- ES5_05_Function扩展
Function 构造器的语法: 注意: 参数 arg1 , arg2 , argN 被函数使用的参数的名称必须是合法命名的.参数名称是一个有效的JavaScript标识符的字符串,或者一个用逗号分隔 ...
- CDH 5.15.2 离线安装
一.前置准备 1. 基础信息 1.1 机器 机器名 服务 hadoop1 主节点 hadoop2 data.task hadoop3 data.task 1.2 服务版本 服务 版本 cdh 5.15 ...
- GBDT--原来是这么回事(附代码)
1. 解释一下GBDT算法的过程 GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,使用的是Boosting的思想. 1.1 Boosting思想 Bo ...