一、类图
第二单元三次作业类图如下:
第一次作业:
第二次作业:
第三次作业:
二、三次作业的调度器设计
第一次作业结构相对简单,虽然只用到一部电梯,但为了减少后续作业的工作量,在调度器的设计上参考了实验课上的设计:输入线程不断读取请求并添加到等待队列中;调度器线程根据实际情况,在合适的时间将等待队列中的请求分配到各个电梯的处理队列;电梯线程处理(运送)自己的处理队列中的请求,并在合适的时间查看等待队列的状态,以便在输入结束后结束电梯线程。在Morning模式下,电梯会等到等待队列长度等于电梯容量,或者输入已经结束时才会将等待中的请求分配给电梯,以提高整体效率,其余模式下调度器会直接将等待队列中的请求转移到电梯的处理队列中。
第二次作业仅仅是增加了多部电梯的要求,由于第一次作业在设计时已经考虑到此需求,所以第二次作业需要做的只有调整调度器的分配策略。我做的策略比较简单,当前情况下哪一部电梯处理队列长度最小,调度器就把请求分配给哪部电梯。
第三次作业新增了可到达楼层的设计,我采用的策略是根据不同的请求情况直接打表,将可以通过换乘快速到达目的地的请求分为两段,运送完第一段后会向等待队列里添加第二段请求,其他的调度策略和第二次作业一致。
三、同步块和锁的设置
为了实现多线程的同步,在所有涉及到等待队列、处理队列的修改、查看的操作上,我都用了同步块以保证多线程的安全。
四、对于自己程序bug的分析
本单元我最终提交的作业出现过几次bug。
在多线程的设计上我并没有出现太多问题,几次bug的出现都是调度策略的问题。第一次bug是由于我没有对电梯运行方向做考虑,导致了电梯运行过程中出现了频繁转向的情况,最终总运行时间超时;后几次bug是我没有充分考虑到三种模式下的不同之处,在一些特殊的样例被卡了时间。
五、分析他人的bug
本单元我并没有发现太多他人的bug。本单元我在互测环节分析他人bug的策略和第一单元大体一致,都是从需求的角度考虑,分析他人采用的调度策略,对症下药。
五、心得体会
本单元我最大的感悟是,多线程比想象中的要复杂。多线程的加入,让本来适应C语言编程的我感到猝不及防。多线程中不同线程的数据交互、多线程同步问题、死锁问题,都让我花费了不少的时间,希望通过此单元的学习,我能有更深的理解。