实验三 线程同步编程练习(操作系统)

要求所有练习保留题目要求,在题目要求后面作答:

代码要求有注释,代码中适当标注关键代码为红色。

要有运行结果的截图。

每题最后应该有对程序的适当分析和总结!

注意格式排版,内容分析注意条目,展开清楚地阐述。

1、分析理解多线程执行中的互斥与同步

1)加入合适的sleep语句,运行体验ppt中的案例,重点是要给出运行效果并详细分析过程,没有分析说明的作业没有成绩。

源代码运行结果:

 

1.孩子还未开始就睡20

 

父母放了5个水果后无空闲位置,孩子还未醒,则父母无法再放,等待孩子吃水果释放空才能继续放。

 

2.一开始让父母就睡10

孩子想要吃水果,父母还未放,孩子只能等待父母放水果。

当父母放上水果后,孩子停止等待,吃水果,吃完后继续等待父母放。 

2)加入合适的sleep语句,运行体验ppt中的案例,重点是要给出运行效果并详细分析过程,没有分析说明的作业没有成绩。

源代码运行结果:

设置生产者睡眠时间比消费者长,模拟生产者速度慢的情况

刚开始没有产品,消费者等生产者生产,生产者生产一个商品后消费者才能消费。

2.生产者不停生产,消费者每睡20消费一次。

 

 

 因为假设仓库无限大,所以生产者不受限制一直生产。

2、编写代码模拟实现如下逻辑要求:

1编写程序让主进程产生两个线程,主进程等待线程共同对共享的进程的长整型变量x做加1操作,当加和到100000时停止工作,主进程在线程结束后输出加和后的结果。如果不加同步控制为什么会加得错的数?

继续给出加入同步控制代码后的实现,使两个线程共同使进程中的x变量做百万次的加法操作但输出得到正确结果。注意不仅要有源码,还要有运行结果,有说明分析!!!!

一开始代码加sleep,理论上y+z=x,不加互斥x=100000时只运行了一个线程结果并没有出错。我认为是时间片没到cpu一直在一个线程上的原因,因此我做了以下两种做法使程序错乱。

①在第一个线程加入sleep(5),出现y+z!=x的情况。

代码如下:

 

②我将y+z的和x扩大到100000000,使计算量增大,程序结果同样出现y+z!=x

加入同步控制语句

①第一种情况,加入sleep后y+z=x

②第二种情况,扩大1000倍也y+z=x

 2)设两个围棋选手下棋,黑先白后,交替下子,但黑方棋艺较高,开局会让对方3个子。试编程模拟两下棋进程之间的落子过程。要有源码,有运行结果,有说明分析!!!!

错误代码:

 错误结果:

错误分析:x=2时,白棋申请empty,执行完后释放product,但黑棋if条件为x>2才能进入。但如果把黑棋的if条件改为x>=2时,当x=1时执行完白棋的的if语句x变为2没有释放product,黑棋抢占后无法申请product,即无法释放empty,进入死锁。

正确源码:

结果

分析:定义整形变量x使x=0,定义控制顺序的变量,使一开始黑棋进入阻塞,直到白棋下三子后,释放黑棋,黑棋才可下子。

【选做】多线程编程实现一群生产者和一群消费者的生产和消费过程,使他们之间符合如下逻辑:没有产品不能消费,没有空不能放入。要有源码,有运行结果,有说明分析!!!!​​​​​​​​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钥钥睡着了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值