哲学家就餐问题

设有5个哲学家。
哲学家就餐问题的解决需要用到条件变量和互斥锁,
在这里插入图片描述
另外,哲学家应该有3个状态:hungry,thinking,eating。声明哲学家变量如下:

在这里插入图片描述


线程的创建不再赘述。


哲学家线程如下:
在这里插入图片描述

  • 这是5个哲学家线程共同调用的线程函数,其中p_n是哲学家的id(索引)。
  • 哲学家通过pickup_forks()函数试图同时拿起位于他左右边的餐具,进入eating状态。通过sleep()函数模拟就餐和思考的过程。

pickup_forks()函数具体如下:
在这里插入图片描述

其中,test()函数是哲学家在试图拿起刀叉,定义如下
在这里插入图片描述

在test函数中,只有当哲学家左右边的餐具都可用(即在紧靠着他左右侧的两位科学家都不在进食状态),且其已经进入饥饿状态的时候,哲学家才会拿起餐具,进入进食状态。
哲学家在进食完成后,会调用return_forks()函数,其具体定义如下:
在这里插入图片描述

该函数让进食完成的哲学家重新进入思考状态,并且通知在他左邻座和右邻座的哲学家他已经进食完成,餐具已经归还。通知这个操作仍然通过test()函数实现,当通知的对象(哲学家)满足进餐要求时,即会调用pthread_cond_signal(&self[p_n]),此时会唤醒“拥有”self[p_n]的线程,pthread_cond_wait()会重新获得mutex锁。


pthread_cond_wait()函数的作用:pthread_cond_wait()在条件不成立时会让线程进入阻塞,然后其会释放mutex锁,使得其他线程能够去获得这个mutex锁,当有线程调用相同的pthread_cond_t对象的pthread_cond_signal(),原先阻塞的线程就会被唤醒,且pthread_cond_wait()会帮助该线程重新获得mutex锁。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值