Linux环境下实现哲学家就餐问题(2)
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h> #define NUM_THREADS_P 5
#define CHAIR_NUM 4
#define CHOP_NUM 5 int chairflg[CHAIR_NUM][],dining_num = ;
sem_t chair,chopstics[CHOP_NUM],mutex,mutex1,print_mutex;
pthread_t threads_p[NUM_THREADS_P]; void *philosopher_thread(void *args); int main(void)
{
int i; sem_init(&chair, , CHAIR_NUM);
for(i=; i<CHOP_NUM; i++)
{
sem_init(&chopstics[i], , );
}
sem_init(&mutex, , );
sem_init(&mutex1, , );
sem_init(&print_mutex, , );
for(i=; i<CHAIR_NUM; i++)
chairflg[i][] = ; for(i=; i<NUM_THREADS_P; i++)
{
pthread_create(&threads_p[i], NULL, philosopher_thread, (void *)i);
}
for(i=; i<NUM_THREADS_P; i++)
{
pthread_join(threads_p[i], NULL);
} // sem_destroy(&chair);
// sem_destroy(&chopstics[CHOP_NUM]);
// sem_destroy(&mutex);
// sem_destroy(&mutex1);
// sem_destroy(&print_mutex); return ;
} void *philosopher_thread(void *args)
{
while()
{
int i,j;
i = (int)args;
printf("philosopher %d is thinking\n",i);
sleep(rand()%);
sem_wait(&chair);
sem_wait(&mutex); for(j=; j<CHAIR_NUM;j++)
{
if(chairflg[j][] == )
{
chairflg[j][] = ;
chairflg[j][] = i;
break;
}
}
dining_num++;
sem_post(&mutex);
sem_wait(&chopstics[i]);
printf("philosopher %d get chopstics %d\n",i,i);
sem_wait(&chopstics[(i+)%CHOP_NUM]);
printf("philosopher %d get chopstics %d\n",i,(i+)%CHOP_NUM); sleep(rand()%);
sem_wait(&print_mutex);
printf("philosopher %d is dining,when he is dining,there are %d philosophers at table.\n",i,dining_num); for(j=; j<CHAIR_NUM; j++)
{
if(chairflg[j][] == i)
{
printf("philosopher %d in chair %d\n",i,j);
}
}
printf("\n\n");
sem_post(&print_mutex);
sleep(rand()%);
sem_post(&chopstics[i]);
sem_post(&chopstics[(i+)%CHOP_NUM]);
sem_wait(&mutex1); for(j=; j<CHAIR_NUM; j++)
{
if(chairflg[j][] == i)
{
chairflg[j][] = ;
break;
}
}
dining_num--;
sem_post(&mutex1);
sem_post(&chair);
printf("philosopher %d leaves\n",i); }
}
Linux环境下实现哲学家就餐问题(2)的更多相关文章
- Linux环境下实现哲学家就餐问题
#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <pthread.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的系统. ...
随机推荐
- 【转】mysql忘记root密码的解决方法
本文收集于本人的笔记本,由于找不到原文出处.在此省略,如哪位知道可以联系我加上. 方法一:在windows下:1.打开命令行(DOS)窗口,停止mysql服务: net stop mysql 2.在D ...
- Eclipse调试:F5、F6、F7、F8
F5:跳入方法 F6:向下逐行调试 F7:跳出方法 F8:直接跳转到下一个断点 转载自:http://blog.sina.com.cn/s/blog_6271df6f0101d856.html
- int *p()与int (*p)()的区别
int *p()是返回指针的函数 int (*p)()是指向函数的指针 返回指针的函数: int *a(int x,int y); 有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号 ...
- ytu 2463:给小鼠补充代码(DFS 深度优先搜索)
2463: 给小鼠补充代码 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 5 Solved: 2[Submit][Status][Web Board] ...
- struts2文件上传类型的过滤
转自:http://www.2cto.com/kf/201403/282787.html 第一种解决方案: 1.手动实现文件过滤: 判断上传的文件是否在允许的范围内定义该Action允许上传的文件类型 ...
- sql经典习题及其答案(纠正错误版)
--网上有好多这套题的答案,但是经过我的验证,有很多都是错的,误人子弟--这是我自己纠正以后的版本 然后呢如果我写的还有不对的欢迎批评指正!--(1)查询2006年以后(包括2006年)的投稿情况,列 ...
- HUE的时区问题
转自 http://molisa.iteye.com/blog/1953390 我主要是根据这个说明调整的HUE的时区问题 在使用Cloudera Hue时遇到一问题: 1. 使用Sqoop导入功 ...
- MySQL监控系统MySQL MTOP的搭建
MySQLMTOP是一个由Python+PHP开发的MySQL企业级监控系统.系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理.最重要是MySQL服务器无需安装任何Agent,只 ...
- D. Array GCD
You are given array ai of length n. You may consecutively apply two operations to this array: remove ...
- GC日志介绍
每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样.但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志: 33. ...