哲学家问题

每次获得一个筷子,会引起死锁的。

解决的办法是,每次尝试去获取所需的两个筷子。第一次获取左边的,第二次获取右边的。

只有当两个都获取到了,才吃东西。否则就要释放所有获得的筷子。

这样就能避免死锁了。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t chopsticks[5];

void fun(int i){

    int k = 0;    

    while(k<50){

        if(pthread_mutex_trylock(&chopsticks[i])==0){

            if(pthread_mutex_trylock(&chopsticks[(i+1)%5])==0){

            printf("zhexuejia %d is eatinging\n",i);k++;
            usleep(10);
            pthread_mutex_unlock(&chopsticks[i]);
            pthread_mutex_unlock(&chopsticks[(i+1)%5]);    

            }else{

                printf("zhexuejia %d is thinking\n",i);k++;
                pthread_mutex_unlock(&chopsticks[i]);
                usleep(10);

            }

        }else{

            printf("zhexuejia %d is thinking\n",i);k++;
            usleep(10);

        }

    }

}

int main(){

    int t = 0;
    while(t<5){

    pthread_mutex_init(&chopsticks[t],NULL);
    t++;

    }

    pthread_t tid1,tid2,tid3,tid4,tid5;
    pthread_create(&tid1,NULL,(void*)fun,0);
    pthread_create(&tid2,NULL,(void*)fun,1);
    pthread_create(&tid3,NULL,(void*)fun,2);
    pthread_create(&tid4,NULL,(void*)fun,3);
    pthread_create(&tid5,NULL,(void*)fun,4);

    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    pthread_join(tid3,NULL);
    pthread_join(tid4,NULL);
    pthread_join(tid5,NULL);

}

时间: 2024-10-22 07:51:54

哲学家问题的相关文章

Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)

本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct process * list } semaphore; value代表当前信号量可以使用的数量,list代表当前信号量上所等待的进程. 1.2 P操作实现 P(semaphore * s) { s.value--; if(s.value < 0) { add current process to s

[经典进程同步问题]哲学家思考

问题描述 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示.哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人.只有当哲学家饥饿的时候,才试图拿起左. 右两根筷子(一根一根地拿起).如果筷子已在他人手上,则需等待.饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考. 问题分析 1) 关系分析.5名哲学家与左右邻居对其中间筷子的访问是互斥关系. 2) 整理思路.显然这里有五个进程.本题的关键是如何让一个哲

【一周读书】哲学家,你们都干了些什么?

书籍:<哲学家们都干了些什么> 在读这本书之前,我对哲学的印象是这样的: 哲学似乎和宗教有点关系?似乎在解决人的精神痛苦方面的问题?哲学就是一大堆难懂并且无用的理论!我要是和同学谈哲学肯定会被无情地嘲笑.但哲学看问题的眼光似乎很有趣?哎呀!我害怕翻哲学书! 看到了吧,我对哲学的印象就是这么混乱.直到这本书撞进我生活,作者提袋瓜子坐在我桌前,把有关哲学所有好玩的.有趣的.有用的故事.理论在几包瓜子的时间就讲清楚了. 现在就来讲讲我的收获. 作者最开始是讲宗教的发展,基督教怎样从一个小小的不出名的

哲学家进餐问题

先直接上代码 1 #define N 5 /* 哲学家数目 */ 2 #define LEFT (i+N-1)%N /* i的左邻编号 */ 3 #define RIGHT (i+ 1)%N /* i的右邻编号 */ 4 #define THINKING 0 /* 哲学家在思考 */ 5 #define HUNGRY 1 /*哲学家试图拿起叉子 */ 6 #define EATING 2 /* 哲学家进餐 */ 7 typedef int semaphore; /*信号量 */ 8 int st

【操作系统】经典的同步问题(生产者消费者问题, 哲学家进餐问题, 读写问题)

用专业术语来说, 进程是程序的一次动态执行.说简单点, 就是进程是系统中的某个任务.操作系统中有多个任务需要执行, 那么怎样执行才能使它们同步呢? 即如何让任务并发执行互不影响呢? 这就引出了进程同步中的经典问题: 生产者消费者问题, 哲学家进餐问题, 读写问题 生产者-消费者问题 有一群生产者进程在生产产品, 并将这些产品提供给消费者进程取消费. 为使生产者进程与消费者进程能并发进行, 在两者间设置了一个具有n个缓冲区的缓冲池, 生产者进程将其所生产的产品翻入缓冲区中, 消费者进程可从一个缓冲

利用Linux下的pthread_mutex_t类型来实现哲学家进餐问题

首先说一下什么是哲学家进餐问题,这是操作系统课程中一个经典的同步问题, 问题如下:如上图,有6个哲学家和6根筷子(那个蓝色部分表示哲学家,那个紫色长条部分表示筷子),他们分别被编了0~5的号!如果某个哲学家想要进餐的话,必须同时拿起左手和右手边的两根筷子才能进餐!哲学家进餐完毕之后,就放下手中拿起的两根筷子!这样其他哲学家就能拿这些筷子进餐了!注意这个哲学家的个数必须是偶数个! OK,这样就可能存在一个死锁问题,比如0号哲学家拿了0号筷子,1号哲学家拿了1号筷子!如此往复,最终的结果就是每个哲学

程序员就应该是半个哲学家

作者:disappearedgod 文章出处:http://blog.csdn.net/disappearedgod/article/details/37876039 时间:2014-7-16 如果你是一个有着高学历的程序员,看着一些低学历程序员鸠占鹊巢式的抢占着研发岗位,你一定会愤愤不平吧: 如果你是一个有着低学历的程序员,看着一些高学历程序员享受生活,而自己还在悲催的啃代码的时候,除了咒骂他们是人渣之外,还有一丝不平等吧: 如果你家境殷实,你会想问什么我们还要再这个封闭的环境内做着别人不能理

操作系统课程设计--Linux平台哲学家问题

哲学家问题是操作系统中资源分配的经典问题 linux平台下的系统api不同于Windows下的实现 要求:一个正确的哲学家程序(不会发生死锁) 一个错误的哲学家程序(会发生死锁) 系统环境:ElementaryOS wrong.c #include<stdio.h> #include<stdlib.h> #include<sys/ipc.h> #include<sys/msg.h> #include<sys/types.h> #include&l

程序猿就应该是半个哲学家

作者:disappearedgod 文章出处:http://blog.csdn.net/disappearedgod/article/details/37876039 时间:2014-7-16 假设你是一个有着高学历的程序猿,看着一些低学历程序猿鸠占鹊巢式的抢占着研发岗位,你一定会愤愤不平吧: 假设你是一个有着低学历的程序猿,看着一些高学历程序猿享受生活.而自己还在悲催的啃代码的时候,除了咒骂他们是人渣之外,另一丝不平等吧: 假设你家境殷实.你会想问什么我们还要再这个封闭的环境内做着别人不能理解

JAVA并发,经典死锁案例-哲学家就餐

转自:http://blog.csdn.net/tayanxunhua/article/details/38691005 死锁经典案例:哲学家就餐. 这个案例会导致死锁. 通过修改<Java编程思想4>一书中的案例,来做实验,代码更易理解,结果也相对容易控制. 附代码: 筷子类: 1 package com.tyxh.ch21.c6; 2 3 public class Chopstick { 4 private boolean taken = false;//判断是此筷子是否被拿起 5 pub