最近的三周面向对象的作业是电梯问题。主要是对多线程编程的一种训练。主要还是对生产者——消费者模型的使用的理解。作业分成了三个阶段,第一个阶段是FIFO调度策略的电梯。第二个阶段是可捎带的电梯设计,第三个部分是多个停靠楼层不同运行速度不同的电梯的合作。
FIFO
因为第一次的作业没有性能上的要求只需要满足正确性,所以我设计了两个线程协同完成这个任务。是个标准的生产者消费者问题。输入线程向共用缓冲区中写入请求,电梯每次读出一个请求之后完成这个请求。期间不关注其他请求,电梯完成请求的动作是硬编码,是正确性的考虑。唯一的多线程问题是安全停止程序。我的策略是在读到请求结束的时候,向中间缓冲区写入end标志,电梯在buffer空的时候检查end标志来确定是否退出。
第一次的程序结构非常简单,GetInput和Buffer共享缓冲区,GetInput从输入中读取内容,写入buffer然后电梯从buffer中读取指令。是简单的单生产者-单消费者问题。程序结构简单,逻辑非常简化,不易出现问题,但是电梯执行的逻辑是硬编码,所以功能十分有限,这导致之后的作业需要重写电梯类。
程序复杂度分析
程序整体的复杂程度非常低,整体代码量也比较少:
代码的数量统计:
进程之间的协作逻辑
第一次作业的时序非常简单,输入线程得到输入,将输入写入缓冲区,电梯从缓冲区读指令,如果有指令则读取并且完成,在完成过程中不关心缓冲区中是否有其他的指令,没有指令就挂起电梯线程,在输入线程输入一个新的指令的时候被唤醒。
线程协作图