【要求】所有练习题保留题目要求,在题目要求后面作答:
代码要求有注释,代码中适当标注关键代码为红色。
要有运行结果的截图。
每题最后应该有对程序的适当分析和总结!
注意格式排版,内容分析注意列条目,展开清楚地阐述。
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,定义控制顺序的变量,使一开始黑棋进入阻塞,直到白棋下三子后,释放黑棋,黑棋才可下子。
【选做】多线程编程实现一群生产者和一群消费者的生产和消费过程,使他们之间符合如下逻辑:没有产品不能消费,没有空不能放入。要有源码,有运行结果,有说明分析!!!!