LINUX 哲学家就餐问题 C语言实例

【摘要】 问题描述
假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。 分析:最多4个人拿起筷子,则可以避免死锁。设置信号量控制。
C语言…

问题描述

假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。
哲学家位置
分析:最多4个人拿起筷子,则可以避免死锁。设置信号量控制。

C语言实现

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

pthread_mutex_t chopsticks[6];  //5个筷子的互斥锁,0不用,使用1~5号

sem_t s; //最多四个人拿起筷子,则不会发生死锁!

void deal(char ch){ int left, right;  //左右筷子的编号,i号筷子在i号哲学家左侧;哲学家逆时针坐 //给筷子编号 if(ch == 'A') { left = 1; right = 5; } else if(ch == 'B') { left = 2; right = 1; } else if(ch == 'C') { left = 3; right = 2; } else if(ch == 'D') { left = 4; right = 3; } else { left = 5; right = 4; } while(1){ sleep(1);  //思考 sem_wait(&s); pthread_mutex_lock(&chopsticks[left]);  //拿起左手的筷子,上锁 printf("Left chopstick(pick) : %d\n", left); pthread_mutex_lock(&chopsticks[right]);  //拿起右手边有筷子 printf("Right chopstick(pick) : %d\n", right); //吃饭 printf("---EATING TIME FOR : %c---\n", ch); sleep(1); //吃完饭 pthread_mutex_unlock(&chopsticks[left]);  //放下左手的筷子 printf("Left chopstick(put) : %d\n", left); pthread_mutex_unlock(&chopsticks[right]);  //放下右手的筷子 printf("Right chopstick(put) : %d\n", right); sem_post(&s); }
}

int main(){ //初始化锁
	int i = 0; for(i = 0; i < 6; ++i) pthread_mutex_init(&chopsticks[i], NULL); //初始化信号量为4 sem_init(&s,0,4); //创建5个哲学家线程 pthread_t A, B, C, D, E; pthread_create(&A, NULL, deal, 'A'); //&A 线程指针,NULL 线程类型,deal 调用函数,‘A’ 函数参数 pthread_create(&B, NULL, deal, 'B'); pthread_create(&C, NULL, deal, 'C'); pthread_create(&D, NULL, deal, 'D'); pthread_create(&E, NULL, deal, 'E'); //线程同步 pthread_join(A, NULL); pthread_join(B, NULL); pthread_join(C, NULL); pthread_join(D, NULL); pthread_join(E, NULL); //销毁信号量 sem_destroy(&s); return 0;
} 

  
 

文章来源: blog.csdn.net,作者:RRRRFLY,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/wangrlan/article/details/116544968

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享