- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机操作系统实验科学家进餐问题
实验二:进程同步
一.实验目的
掌握基本的同步算法,理解生产者消费者模型。
学习使用Windows XP中基本的同步对象,掌握相关API的使用方法。
了解Windows XP中多线程的并发执行机制,实现进程的同步与互斥。
二.实验属性
该实验为设计性实验。
三.实验仪器设备及器材
普通PC386以上微机
四.实验要求
本实验要求2学时完成。
本实验要求完成如下任务:
(1)以生产者/消费者模型为依据,在Windows XP环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。
学习并理解生产者/消费者模型及其同步/互斥规则;
学习了解Windows同步对象及其特性;
熟悉实验环境,掌握相关API的使用方法;
设计程序,实现生产者/消费者进程(线程)的同步与互斥。
(2)扩展任务2选1:
1利用信号量机制,写出不会发生死锁的解决哲学家进程(线程)。
最多允许4个同时进餐;
奇:先左后右 偶:先右后左。
2利用信号量机制,写出不会发生死锁的读者写者进程(线程)。
五:实验内容:
利用至多同时允许4位哲学家同时去拿左边筷子的方法解决进餐死锁的问题。
实验详细设计:
程序首先创建一个线程参数结构体
struct ThreadInfo
{
int serial;
double delay;
};
设置最多同时去拿筷子的人数 #define MAX_BUFFER_NUM 4
设置一个信号量数组用来表示五位哲学家的左右边的筷子 HANDLE chopstick [5];
设置同时去拿筷子的人数的信号量 HANDLE People;
设置一个互斥信号量 HANDLE h_mutex;
在main()函数中,首先创建信号量:
for (int i=0;i5;i++)
{
chopstick[i]=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical,chopstick+i);
}
People=CreateSemaphore(NULL,MAX_BUFFER_NUM,MAX_BUFFER_NUM,People);
h_mutex=CreateMutex(NULL,FALSE, mutex_for_update);
创建线程
for (int j=0;j(int)n_Thread;j++)
{
h_Thread[j]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(eat),(Thread_Info[j]),0,NULL);
}
线程执行函数:
void eat(void*p)
{
//局部变量声明
DWORD wait_for_semaphore1,wait_for_semaphore2,wait_for_People,wait_for_mutex,m_delay;
int m_serial;
//获得本线程信息
m_serial=((ThreadInfo*)(p))-serial;
WaitForSingleObject(h_mutex,-1);
WaitForSingleObject(People,-1);
printf(哲学家 %2d 开始准备拿筷子.\n,m_serial);
wait_for_semaphore1=WaitForSingleObject(chopstick[m_serial],-1);
wait_for_semaphore2=WaitForSingleObject(chopstick[(m_serial+1)%5],-1);
ReleaseSemaphore(People,1,NULL);
ReleaseMutex(h_mutex);
Sleep(1000);
printf(哲学家 %2d 开始进餐.\n,m_serial);
Sleep(1000);
printf( 哲学家 %2d 结束进餐.\n,m_serial);
ReleaseSemaphore(chopstick[m_serial],1,NULL);
ReleaseSemaphore(chopstick[(m_serial+1)%5],1,NULL);
//ReleaseSemaphore(People,1,NULL);
}
六:实验结果调试
实验总结:
这次实验最主要的难点实在信号量的使用上,刚开始由于信号量使用的位置不是很正确,结果造成一些数据竞争,并且出现死锁的现象,后来经过仔细检查,最后终于正确的将各个信号
您可能关注的文档
最近下载
- 大学东南大学vlsi设计基础数字集成电路_2016vlsi1-课程介绍for mooc.pdf VIP
- 医美网络咨询与沟通(医美咨询师课件).pptx
- 2025中国华电集团有限公司校招+社招笔试参考题库附带答案详解.docx
- 【打印】人教版小学3-6年级英语词汇表.pdf VIP
- 液化气体钢瓶充装前后检查及充装记录.docx VIP
- 2025年高考数学新定义题型:集合下的新定义(四大题型)学生版+解析.pdf VIP
- 科室医疗质量自查工作制度.docx VIP
- 江苏省2017届九年级化学下学期第二次模拟试题.pdf VIP
- 广州市公务车维修项目工时费明细表.pdf VIP
- 内蒙古自治区点石联考2026届高三上学期9月份联合考试政治试卷(含答案).docx VIP
文档评论(0)