- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
中国石油大学Linux实验报告下
实验报告名称: Linux系统实验
[Linux系统实验]实验报告
班级 软件10-01
姓名 周诗豪
学号日期 2012年12月3日
Linux系统实验实验报告包括5,6,7、8共四个实验。
评阅人
评语
实验五
实验名称:哲学家进餐
一 实验目的
初步了解线程编程知识。
掌握linux环境下的多线程编程。
通过编程加深对知识的理解。
二 实验内容
在linux环境下实现哲学家进餐模型。
三 实验环境
软件环境:Red Hat Linux 2.4.20-8,VMware WorkSation ACE 版
硬件环境:DELL XPS L502x
四 实验整体思路(请列出实验用到的算法和思路)
主要思路:
实验中一个哲学家线程的处理分为:
将面条分给某个人,分面条的时候对面条进行加锁。分完之后解锁。
将一双筷子分给某个人,分筷子的时候对所有的筷子进行加锁。避免出现不愉快的事情。分完之后解锁。
当一个人吃饭完之后,首先对筷子进行加锁,然后释放所持有的筷子并发通知给两边的人,让两边的人检查是否有一双筷子吃饭。
因为电脑处理速度过快,执行sleep( )让线程挂起一断时间。(避免一直只有一个人在吃)。
在int main( )中
创建一组线程号pthread_t th[NUMBER];
创建任意传值指针void * retval;
初始化桌子init(T);
循环创建5个哲学家进程pthread_create(th[i],NULL,philosopher,(void *) i);
等待哲学家进程结束pthread_join(th[i],retval);
回收资源del(T);
程序中使用table结构体装桌子上的所有东西。
struct table
{ //桌子内容
int chopsticks[NUMBER]; //筷子当前是否空闲1空闲
pthread_mutex_t lock; //同时只能一个人操作桌子
pthread_cond_t philosopher[NUMBER]; //能拿筷子的信号
int nuddles; //剩余面条数
pthread_mutex_t nlock; //面条锁
}T;
void pick_chopsticks(int Nmbr)
{
pthread_mutex_lock(T.lock); //某个哲学家正在操作所以加锁
if(T.chopsticks[Nmbr] == 1 T.chopsticks[(Nmbr+NUMBER-1)%NUMBER] == 1)
{ //IF一个人两边的筷子都可以使用
T.chopsticks[Nmbr] = 0; //筷子占用中
T.chopsticks[(Nmbr+NUMBER-1)%NUMBER] = 0;
}
else pthread_cond_wait(T.philosopher[Nmbr],T.lock);//没筷子 等着
pthread_mutex_unlock(T.lock); //操作完毕解锁
}
void drop_chopsticks(int Nmbr)
{
pthread_mutex_lock(T.lock); //加锁
T.chopsticks[Nmbr] = 1; //吃完饭将筷子解锁
T.chopsticks[((Nmbr+NUMBER-1)%NUMBER)] = 1;
pthread_cond_signal(T.philosopher[(Nmbr+1)%NUMBER]);//筷子释放信号
pthread_cond_signal(T.philosopher[(Nmbr+NUMBER-1)%NUMBER]);
pthread_mutex_unlock(T.lock);
}
void *philosopher(void *arg)
{
//接收pthread_create(th[i],NULL,philosopher,(void *) i);中的i来确定哲学家号
int Nmbr, tms;
Nmbr = (int) arg;
int ff = 0;
while(1)
{ff=0;
pthr
您可能关注的文档
最近下载
- 叠合板专项施工方案--超危大.pdf VIP
- 4.1 观察物体(一)(课件)数学青岛五四版二年级上册(新教材).pptx VIP
- 【外研社Unipus】新探索研究生英语(基础级)读写教程U6课件_AE1.pptx VIP
- 横纹肌溶解症ppt课件.pptx VIP
- 职业生涯规划管理课件PPT.pptx VIP
- 22G101图集三维解读(现浇砼框架)2023年.pptx VIP
- 辽宁省学业水平测试近三年物理真题.docx
- 马克思劳动价值理论教案.docx VIP
- 汉语词性类(实词).ppt VIP
- ISO 9001(DIS)-2026《质量管理体系——要求》(含附录使用指南-中文版-雷泽佳译-2025年9月10日).pdf VIP
文档评论(0)