BUAA OO Unit hw_2

1.总体架构及分析线程之间的关系、如何处理交互

主线程负责创建电梯线程,input线程,以及建立电梯和input、电梯和电梯之间共享的类。

电梯的核心部分就是判断状态:

第一次作业:

乘客指定了电梯,线程之间的交流主要是电梯和input之间通过request,电梯需要判断状态,当电梯发现request列表为空以及电梯内部乘客为空时,需要wait(),来减少对cpu的消耗,当input分配给request任务时,需要notify()

第二次作业:

乘客未指定电梯,且电梯会reset,笔者使用的是随机分配,需要增加一个waitrequest列表来表示哪些电梯是可以被分配任务的,reset期间电梯应当离开waitrequest列表,因为两个线程共享它,需要注意同步和互斥,具体实现是上锁,解锁。

第三次作业:

电梯会变成双桥厢,增加的内容其实就是两个双桥厢电梯间的沟通,笔者增加了一个类来表示transFloor是否为空,以及两个电梯什么时候可以结束。与第一次作业不同的是,当伙伴电梯还在运行的时候,该电梯不能结束,可能伙伴电梯还会给它运人。

具体实现不碰撞的代码如上,在准备移动时判断下个楼层是否是transFloor,如果被占用就等待。

二、debug

简单测试:测试一下电梯是否能正常送人,双桥厢电梯是否可以简单协作等等,输入一条指令就可以。

用投喂包可以实现更进一步的测试。

关于ctle,一般就是发生了轮询,一般出现在run的while(true),更一般的就是各个循环,可以print来看看哪里出现了问题。

随机算法不太好debug,同一数据很难复现出现的bug。

三、心得体会

关于多线程,一定要先弄清楚线程之间的关系,线程之间的通信部分写的清晰有助于debug,这个单元真是一个难忘的单元。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值