Linux环境下实现哲学家就餐问题
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <pthread.h>
#include <errno.h>
#include <math.h>
//筷子作为mutex
pthread_mutex_t chopstick[] ;//定义以筷子为锁的数组
void *eat_think(void *arg)
{
char phi = *(char *)arg; //将任意类型的指针*arg转化为*char类型
int left,right; //左右筷子的编号
switch (phi){
case 'A':
left = ;
right = ;
break;
case 'B':
left = ;
right = ;
break;
case 'C':
left = ;
right = ;
break;
case 'D':
left = ;
right = ;
break;
case 'E':
left = ;
right = ;
break;
} int i;
for(;;){
usleep(); //思考,将进程挂起一段时间
pthread_mutex_lock(&chopstick[left]); //拿起左手的筷子,锁定互斥量,加锁
printf("Philosopher %c fetches chopstick %d\n", phi, left);输出哲学家拿起了左手边的筷子
if (pthread_mutex_trylock(&chopstick[right]) == EBUSY){ //判断右手的筷子是否有人用, 再试一次获得对互斥量的锁定(非阻塞)
pthread_mutex_unlock(&chopstick[left]); //如果右边筷子被拿走放下左手的筷子,解锁互斥量,解锁
continue;//如果此哲学家没能吃饭,验证下一个哲学家是否能吃饭,即跳出本次循环进行下次循环
} // pthread_mutex_lock(&chopstick[right]); //拿起右手的筷子,如果想观察死锁,把上一句if注释掉,再把这一句的注释去掉
printf("Philosopher %c fetches chopstick %d\n", phi, right); //输出此哲学家又拿起了右手边的跨子
printf("Philosopher %c is eating.\n",phi);//输出此次的哲学家拿起啦一双筷子在吃饭
usleep(); //吃饭,把进程挂起一段时间
pthread_mutex_unlock(&chopstick[left]); //放下左手的筷子
printf("Philosopher %c release chopstick %d\n", phi, left);
pthread_mutex_unlock(&chopstick[right]); //放下右手的筷子
printf("Philosopher %c release chopstick %d\n", phi, right); }
}
int main(){
pthread_t A,B,C,D,E; //5个哲学家 int i;
for (i = ; i < ; i++)
pthread_mutex_init(&chopstick[i],NULL);//初始化默认互斥锁属性的互斥锁数组chopstick[i],默认属性为快速互斥锁
pthread_create(&A,NULL, eat_think, "A");////创建并跳转到线程函数创建并跳转到参数为指向线程标识符的指针为 A 线程函数eat_think,A是运行函数的参数
pthread_create(&B,NULL, eat_think, "B");
pthread_create(&C,NULL, eat_think, "C");
pthread_create(&D,NULL, eat_think, "D");
pthread_create(&E,NULL, eat_think, "E"); pthread_join(A,NULL);//等待线程标识符为 A 的eat_think线程函数结束
pthread_join(B,NULL);
pthread_join(C,NULL);
pthread_join(D,NULL);
pthread_join(E,NULL);
return ;
}
Linux环境下实现哲学家就餐问题的更多相关文章
- Linux环境下实现哲学家就餐问题(2)
		
#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <string.h& ...
 - linux 环境下运行STS时 出现must be available in order to run STS
		
linux 环境下运行ECLIPSE时 出现 “ A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be avai ...
 - Linux环境下部署完JDK后运行一个简单的Java程序
		
前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...
 - linux环境下学习使用pro*c/c++工具
		
1.proc是oracle用来预编译嵌入SQL语句的c程序. 2.如何使用proc工具 在Linux环境下,首先确保gcc编译器正常使用,安装oracle数据库或者客户端,一般就会默认安装pro*c/ ...
 - Linux环境下段错误的产生原因及调试方法小结(转)
		
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...
 - java 在linux环境下写入 syslog 问题研究
		
1.Syslog 在Unix类操作系统上,syslog广泛应用于系统日志.syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器.接收syslog的服务器可以对多个设 ...
 - 【环境配置】Linux环境下下载、配置java环境、安装eclipse、建立eclipse快捷方式详解
		
一.首先是下载Java JDK 到目前为止的最新版本为(jdk1.8.0_60),有两种方式进行下载: 1.使用shell来进行下载,可使用如下命令直接进行下载: wget --no-check-ce ...
 - Linux环境下安装Tigase XMPP Server
		
Tigase是一种XMPP服务器,可以作为采用XMPP协议的各种IM(Instant Messeging)工具(如Pandion.Spark等)的服务器. 在Linux环境下安装Tigase的步骤如下 ...
 - 教你如何在Kali Linux 环境下设置蜜罐?
		
导读 Pentbox是一个包含了许多可以使渗透测试工作变得简单流程化的工具的安全套件.它是用Ruby编写并且面向GNU/Linux,同时也支持Windows.MacOS和其它任何安装有Ruby的系统. ...
 
随机推荐
- 一些LUA函数(转载)
			
转自http://hi.baidu.com/chevallet/item/9a3a6410c20d929198ce3363 一些LUA函数 1.assert (v [, message]) 功能:相当 ...
 - sql SELECT时的with(nolock)选项说明
			
I used to see my senior developers use WITH (NOLOCK) when querying in SQL Server and wonder why they ...
 - jQuery操作复选框的简单使用
			
开发中为了实现一个小功能,就是复选框的相互影响事件,如下图: 就是通过复选框设置权限,权限是分等级的,这是一个web管理系统的应用,一个管理员具有三个权限赋予,权限也是有等级的,其中删除和编辑权限相当 ...
 - codeforces  468A. 24 Game  解题报告
			
题目链接:http://codeforces.com/problemset/problem/468/A 题目意思:给出一个数n,利用 1 - n 这 n 个数,每个数只能用一次,能否通过3种运算: + ...
 - sql,联合主键,按id分组求版本号最大值的集合
			
表结构如下: /* SQLyog v10.2 MySQL - 5.5.39 ************************************************************** ...
 - jQuery工具函数
			
要点:1.字符串操作2.数组和对象操作3.测试操作4.URL 操作5.浏览器检测6.其他操作 工具函数是指直接依附于 jQuery 对象,针对 jQuery 对象本身定义的方法,即全局性的函数.它的作 ...
 - onItemClick 参数解释
			
X, Y两个listview,X里有1,2,3,4这4个item,Y里有a,b,c,d这4个item.如果你点了b这个item.如下:public void onItemClick (AdapterV ...
 - linux 小喇叭 没了
			
Waiting for sound system to respond 方法: # pulseaudio --start -D W: main.c: This program is not inten ...
 - centos7下安装vsftpd配置
			
0. 首先安装ftp服务 yum install -y ftp 1. 通过yum install -y vsftp安装vsftp 2. 修改vi /etc/vsftpd/vsftpd.conf, ...
 - h5 canvas 画图
			
h5 canvas 画图 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...