#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)的更多相关文章

  1. Linux环境下实现哲学家就餐问题

    #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <pthread.h& ...

  2. 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 ...

  3. Linux环境下部署完JDK后运行一个简单的Java程序

    前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...

  4. linux环境下学习使用pro*c/c++工具

    1.proc是oracle用来预编译嵌入SQL语句的c程序. 2.如何使用proc工具 在Linux环境下,首先确保gcc编译器正常使用,安装oracle数据库或者客户端,一般就会默认安装pro*c/ ...

  5. Linux环境下段错误的产生原因及调试方法小结(转)

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...

  6. java 在linux环境下写入 syslog 问题研究

    1.Syslog 在Unix类操作系统上,syslog广泛应用于系统日志.syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器.接收syslog的服务器可以对多个设 ...

  7. 【环境配置】Linux环境下下载、配置java环境、安装eclipse、建立eclipse快捷方式详解

    一.首先是下载Java JDK 到目前为止的最新版本为(jdk1.8.0_60),有两种方式进行下载: 1.使用shell来进行下载,可使用如下命令直接进行下载: wget --no-check-ce ...

  8. Linux环境下安装Tigase XMPP Server

    Tigase是一种XMPP服务器,可以作为采用XMPP协议的各种IM(Instant Messeging)工具(如Pandion.Spark等)的服务器. 在Linux环境下安装Tigase的步骤如下 ...

  9. 教你如何在Kali Linux 环境下设置蜜罐?

    导读 Pentbox是一个包含了许多可以使渗透测试工作变得简单流程化的工具的安全套件.它是用Ruby编写并且面向GNU/Linux,同时也支持Windows.MacOS和其它任何安装有Ruby的系统. ...

随机推荐

  1. iOS 一个工程中引用其他工程时编译的Architecture问题

    当引用了其他工程时,在编译时报错,提示你编译指令架构不对,你需要查看一下这几个工程的Architecture部分是否又冲突,比如主工程设置Valid Architecture为armv7 而 另一个子 ...

  2. [Android Pro] proguard.cfg 配置文件

    转载自:http://my.oschina.net/zhangzhihao/blog/72393 # ------------------------------------- # android 原 ...

  3. 重命名nginx服务器

    为了防止被黑客扫描到web服务器信息,通过相对应的web服务器信息找出对应的版本漏洞,从而对web服务器进行入侵,nginx虽然功能强大,但是也是软件,软件就可能会有漏洞,例如nginx-0.6.32 ...

  4. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

  5. linux常见问题集锦

    本文转自 http://bbs.chinaunix.net/thread-3668921-1-1.html,在此感谢作者分享 一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. ...

  6. 一、HTML和CSS基础--HTML+CSS基础课程--第6部分

    第十一章 CSS代码缩写,占用更少的带宽 盒模型代码简写
:还记得在讲盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上 ...

  7. sqlserver临时启用和关闭约束

    select  'ALTER TABLE ['  + b.name +  '] NOCHECK CONSTRAINT ' +  a.name +';' as  禁用约束   from  sysobje ...

  8. MySQL Auto_Increment属性应用

        我们经常要用到唯一编号,以标识记录.在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成.MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据 ...

  9. linux上ln链接命令详细说明

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...

  10. js 抽奖转盘实现

    今天用js实现转盘抽奖功能,从后台返回的值可以固定转盘选择停止的任意位置 实现代码如下: js: <script> , i = ;//auto:时间对象 count:计数器 ,i : 计数 ...