当前位置: 首页 > 编程日记 > 正文

大闸蟹的OO第二单元总结

OO的第二单元是讲多线程的协作与控制,三次作业分别为FAFS电梯,ALS电梯和三部需要协作的电梯。三次作业由浅入深,让我们逐渐理解多线程的工作原理和运行状况。

第一次作业:

第一次作业是傻瓜电梯,也就是完全不需要考虑捎带策略,只需要简单的把每一个人都送到目的楼层就可以。与以往写过的程序不同的是,这次要采取多线程的 模式,输入和输出并不同时,输入是按照时间投放的,输出也要包含时间信息。这次作业主要是想教会我们生产者——消费者模型的使用。然而,在第一次写这次作业的时候,我把输入当成生产者,调度器当作托盘,却把每一条请求都当作了一个消费者,试图让每一条指令单独去跑(这或许就是我对多线程最初的理解,然而其实这次作业中的多线程是让我们将输出和输入两个线程并发执行),导致出现了很离谱的错误。并且,在试图保证每两条请求的运行不能够出现重叠,我还想在调度器中设置该条指令是否结束的标志位,这个方法看上去是可行的,但是我当时对于notifyALL,wait等还不是很理解,甚至想尝试在run()方法的最后加入notifyALL(),企图来唤醒正在等待的线程,发现根本无动于衷23333,最后我甚至想到了wait(100)再去查询的zz方法,虽然这样能够跑出来,但是这是一个浪费CPU的轮询,而且线程会频繁的被唤醒然后wait。最终,在我积极的与同学交流的过程中,终于慢慢理解了这道题的本意,将其改成了输入生产者,输出消费者,变成了比较正常的思路。但改完之后,我还是遇到了问题,那就是怎么样让他停下来。输入线程根据给的样例遇到null就会停,那输出怎么办。于是,我在输入线程遇到null停止之前把null也传进来,输出线程遇到null也停止,这样终于搞定了第一次作业。

类图如下:

度量分析如下:

可以看出,这次由于正确的采用了生产者消费者模式,所以各个类和方法的复杂度都比较低,设计的比较好。

第二次作业:

第二次作业是als电梯,也就是要采取捎带策略的电梯。指导书中给的捎带方法为将与主请求同一方向的请求作为捎带请求加入,并且不断地去更新主请求。我采用的方法是将第一条请求作为主请求,然后将与他同方向的,并且是当前运行到的楼层可以携带的请求全部加到电梯运行的请求队列中,然后将电梯请求队列中的请求都跑完并且电梯中没有人作为一次主请求及其捎带请求跑完的判断条件。我觉得不断升级主请求和我采用的方法实现起来的结构是基本一样的。由于在电梯开关门以及每到一层都可能会输入能够捎带的请求,所以在每一次电梯开关门上下层,我都会判断一次是否有能够捎带进来的请求。这种方法会有不停的对请求队列遍历去查找的问题,不过貌似对40条指令的遍历并不会太占CPU。然而,大闸蟹还是在强测中因为一个小小小小小小小的问题,被炸掉了一大半0.0。在判断捎带的时候,我采用的是判断读到的请求的进入楼层>=当前楼层并且方向向上,以及进入楼层<=当前楼层并且方向向下这样的条件来判断的,为了节省字符数,满足checkstyle,我将这些if分开嵌套,然后就出现了在刚刚上去到达的楼层开始有一堆请求要向下,但是这些请求进的都是>=的那个if,导致并没有带着他们走下去0.0。

对于优化,我想了这几种策略。一是在去接主请求的路上可以把能够在主请求楼层之前出去的请求先送过去,以此来解决那些上来就16-1,后面却跟着一些1-2,1-3之类的测试点。对于寻找主请求的时候,如果只是找第一条作为主请求,那么15-1,16-1,17-1这样的就会不停的上下,所以在寻找主请求的时候我也尽可能让它一次性能够覆盖到足够多的请求,来节省时间。(然而再怎么优化,由于上面那个小小小小小小小的问题我还是凉了)。

类图如下:

度量分析如下:

可以看出,架构基本和第一次一样,但是由于我在每一次开关门以及每一层上下楼都去判断是否有捎带的请求,导致电梯线程的复杂度较高。

第三次作业:

第三次作业是三台电梯一起运行,各自有各自的可达楼层,有各自的载客量,对于某些请求,还需要让乘客换成(这难道不是乘客应该考虑的事情吗2333,还有那诡异的残次品C电梯以及只有C才能到达的神秘三楼)。我大致采用了之前的架构,在get方法中增加了对于电梯名字以及是否是该架电梯可以送的人的判断。为了处理换乘问题,我新建了一个类,其中包含两个PersonRequest对象,用来拆分开需要换乘的请求。在执行一条请求时,判断其中第二个PersonRequest对象是否为null,不是的话就将其压到调度器的队列里面。

怎么样让电梯停下来是我本次作业遇到的最难的问题。由于我之前都是往里面压null,读到了才停,而这一次,如果依旧是读到null停的话可能会在之后分来出来的请求无法执行,会被炸掉。于是我就想让读到null不停下也不拿走,而是更改标志位空跑,知道分离过的请求全部跑完才去停。然后我就发现会有一个请求一直在跑null= =。既然这样,那我就让null被拿走,然后输入null的时候多输入两个,我以为这样三个电梯都会读到null停下来,然而,有一个电梯会把所有的null都抢走然后就没有然后了= =。最终,我发现,为什么要在输入的时候搞进去null呢,我为什么不再所有要分离的指令都搞定的时候再插入null让电梯停下来...菜到流泪(⊙﹏⊙)

然而,最让我想不到的是,又有一个小小小小小小小的bug炸掉了我强测一大半的点。我在有一个电梯中用来计人数的计数器忘记了清零= =。而且所有炸我的还全部是随机生成的数据,甚至被同学hach14次也全部都是随即数据乱炸0.0。de掉这个bug甚至用了一天。真是写程序不细心,debug两行泪 ┭┮﹏┭┮

类图如下:

度量分析如下:

可以看出,架构其实还是差不多的,只是原来是用PersonRequest现在变成了我自己新建的类,并且输出采用了加锁的静态方法。

由于和第二次架构基本一样,复杂度高的地方也基本一样。

 BUG分析:

这三次作业,我自己的bug大都是不细心导致的。(然而都是小bug却导致了大问题,非洲人无话可说0.0)

对与寻找别人的bug,第一次作业,大家都不怎么会测并且傻瓜电梯实在是难出bug,随意根本没有hack到别人。第二次作业,我大部分采用的是我自己遇到的bug,比如停不下来,比如某些捎带请求拿了进去却没办法跑,成功发现了一台能够上天堂的电梯和一台吃人的电梯。第三次作业,我认为大家跑应该是没有问题的,大部分的问题是某些情况停不下来(然而我自己却是跑丢了0.0,或许我找的方向不怎么对),于是我采用了随机数据去测试其他人看能否停下来,停不下来才交,结果只发现了很少的错误,而同组的barsaker是直接交随机数据,结果却炸掉了好多好多人,(虽然全部是同质)。

体会与感想:

这一单元给我的感想是,写的时候开开心心,出分的时候想沙河主楼跃解千愁。但不管怎么样,对于多线程还是逐渐理解了的。多线程的这种不确定性,bug的不可复现性也大大大大大大锻炼了我们的debug能力。这一单元的测评还是比较严格的,虽然像我这种的非到小bug炸全家的不多见,并且好像也找不出什么能够拯救我这种每次都是因为一点点点点小bug被大面积炸的可怜孩子(非洲人无话可说)。

总而言之,这一单元是有挑战的一单元,也是极大锻炼我们能力的一单元。

转载于:https://www.cnblogs.com/duanzhengxu/p/10754500.html

相关文章:

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(31)-MVC使用RDL报表

原文:构建ASP.NET MVC4EF5EasyUIUnity2.x注入的后台管理系统&#xff08;31&#xff09;-MVC使用RDL报表这次我们来演示MVC3怎么显示RDL报表,坑爹的微软把MVC升级到5都木有良好的支持报表,让MVC在某些领域趋于短板 我们只能通过一些方式来使用rdl报表。 Razor视图不支持asp.net…

18段代码带你玩转18个机器学习必备交互工具

&#xff08;图片有AI科技大本营付费下载自视觉中国&#xff09;作者 | 曼纽尔阿米纳特吉&#xff08;Manuel Amunategui&#xff09;、迈赫迪洛佩伊&#xff08;Mehdi Roopaei&#xff09;来源 | 大数据&#xff08;ID&#xff1a;hzdashuju&#xff09;【导读】本文简要介绍将…

激活函数之ReLU/softplus介绍及C++实现

softplus函数(softplus function)&#xff1a;ζ(x)ln(1exp(x)).softplus函数可以用来产生正态分布的β和σ参数&#xff0c;因为它的范围是(0,∞)。当处理包含sigmoid函数的表达式时它也经常出现。softplus函数名字来源于它是另外一个函数的平滑(或”软化”)形式&#xff0c;这…

windows server 2012 用sysdba登录报错 ORA-01031

报错显示&#xff1a;C:\Users\Administrator>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期三 4月 24 09:09:33 2019 Copyright (c) 1982, 2010, Oracle. All rights reserved. ERROR:ORA-01031: 权限不足 请输入用户名: 1、查看本地用户和组确认权…

[SignalR]初步认识以及安装

原文:[SignalR]初步认识以及安装1.什么是ASP.NET SignalR&#xff1f; ASP .NET SignalR是一个 ASP .NET 下的类库&#xff0c;可以在ASP .NET 的Web项目中实现实时通信。什么是实时通信的Web呢&#xff1f;就是让客户端&#xff08;Web页面&#xff09;和服务器端可以互相通知…

CUDA Samples:Vector Add

以下CUDA sample是分别用C和CUDA实现的两向量相加操作&#xff0c;参考CUDA 8.0中的sample:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\0_Simple&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;各个文件内容如下&#xff1a;common.hpp:#ifndef FBC_CU…

你和人工智能的对话,正在被人工收听

&#xff08;图片有AI科技大本营付费下载自视觉中国&#xff09;作者 | 周晶晶编辑 | 阿伦来源 | 燃财经&#xff08;ID:rancaijing&#xff09;如今&#xff0c;智能设备越来越多地出现在每个人的生活中&#xff0c;在享受它们带来的便利时&#xff0c;很多人或许没有意识到&a…

python数据结构与算法总结

python常用的数据结构与算法就分享到此处&#xff0c;本月涉及数据结构与算法的内容有如下文章&#xff1a; 《数据结构和算法对python意味着什么&#xff1f;》 《顺序表数据结构在python中的应用》 《python实现单向链表数据结构及其基本方法》 《python实现单向循环链表数据…

自定义classloader中的接口调用

2019独角兽企业重金招聘Python工程师标准>>> 注意其中转型异常的描述&#xff0c;左边声明和强转括号内都是appclassloader加载的&#xff0c;而让自定义加载类的接口也由appclassloader加载&#xff0c;所以转型成功 转载于:https://my.oschina.net/heatonn1/blog/…

学点基本功:机器学习常用损失函数小结

&#xff08;图片付费下载自视觉中国&#xff09;作者 | 王桂波转载自知乎用户王桂波【导读】机器学习中的监督学习本质上是给定一系列训练样本 &#xff0c;尝试学习 的映射关系&#xff0c;使得给定一个 &#xff0c;即便这个不在训练样本中&#xff0c;也能够得到尽量接近…

python生成简单的FTP弱口令扫描

2019独角兽企业重金招聘Python工程师标准>>> 前言 Ftp这个类实现了Ftp客户端的大多数功能,比如连接Ftp服务器、查看服务器中的文件、上传、下载文件等功能,Ftp匿名扫描器的实现&#xff0c;需要使用FTP这个类,首先用主机名构造了一个Ftp对象(即ftp),然后用这个ftp调…

C++中const指针用法汇总

这里以int类型为例&#xff0c;进行说明&#xff0c;在C中const是类型修饰符&#xff1a;int a; 定义一个普通的int类型变量a&#xff0c;可对此变量的值进行修改。const int a 3;与 int const a 3; 这两条语句都是有效的code&#xff0c;并且是等价的&#xff0c;说明a是一个…

mongodb基础应用

一些概念 一个mongod服务可以有建立多个数据库&#xff0c;每个数据库可以有多张表&#xff0c;这里的表名叫collection&#xff0c;每个collection可以存放多个文档&#xff08;document&#xff09;&#xff0c;每个文档都以BSON&#xff08;binary json&#xff09;的形式存…

【leetcode】1030. Matrix Cells in Distance Order

题目如下&#xff1a; We are given a matrix with R rows and C columns has cells with integer coordinates (r, c), where 0 < r < R and 0 < c < C. Additionally, we are given a cell in that matrix with coordinates (r0, c0). Return the coordinates of…

深度学习面临天花板,亟需更可信、可靠、安全的第三代AI技术|AI ProCon 2019

整理 | 夕颜 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 在人工智能领域中&#xff0c;深度学习掀起了最近一次浪潮&#xff0c;但在实践和应用中也面临着诸多挑战&#xff0c;特别是关系到人的生命&#xff0c;如医疗、自动驾驶等领域场景时&#xff0c;黑盒…

java robot类自动截屏

直接上代码:package robot;import java.awt.Rectangle;import java.awt.Robot;import java.awt.event.InputEvent;import java.awt.p_w_picpath.BufferedImage;import java.io.File;import java.io.IOException;import javax.p_w_picpathio.ImageIO;import com.sun.glass.event…

激活函数之softmax介绍及C++实现

下溢(underflow)&#xff1a;当接近零的数被四舍五入为零时发生下溢。许多函数在其参数为零而不是一个很小的正数时才会表现出质的不同。例如&#xff0c;我们通常要避免被零除或避免取零的对数。上溢(overflow)&#xff1a;当大量级的数被近似为∞或-∞时发生上溢。进一步的运…

parsing:NLP之chart parser句法分析器

已迁移到我新博客,阅读体验更佳parsing:NLP之chart parser句法分析器 完整代码实现放在我的github上:click me 一、任务要求 实现一个基于简单英语语法的chart句法分析器。二、技术路线 采用自底向上的句法分析方法&#xff0c;简单的自底向上句法分析效率不高&#xff0c;常常…

图解Python算法

普通程序员&#xff0c;不学算法&#xff0c;也可以成为大神吗&#xff1f;对不起&#xff0c;这个&#xff0c;绝对不可以。可是算法好难啊~~看两页书就想睡觉……所以就不学了吗&#xff1f;就一直当普通程序员吗&#xff1f;如果有一本算法书&#xff0c;看着很轻松……又有…

详解SSH框架的原理和优点

Struts的原理和优点. Struts工作原理 MVC即Model-View-Controller的缩写&#xff0c;是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合&#xff0c;以及让视图层更富于变化。MVC的工作原理,如下图1所示&#xff1a;Struts 是MVC的一种实现&#xff0…

Numpy and Matplotlib

Numpy介绍 编辑 一个用python实现的科学计算&#xff0c;包括&#xff1a;1、一个强大的N维数组对象Array&#xff1b;2、比较成熟的&#xff08;广播&#xff09;函数库&#xff1b;3、用于整合C/C和Fortran代码的工具包&#xff1b;4、实用的线性代数、傅里叶变换和随机数生成…

梯度下降法简介

条件数表征函数相对于输入的微小变化而变化的快慢程度。输入被轻微扰动而迅速改变的函数对于科学计算来说可能是有问题的&#xff0c;因为输入中的舍入误差可能导致输出的巨大变化。大多数深度学习算法都涉及某种形式的优化。优化指的是改变x以最小化或最大化某个函数f(x)的任务…

微软亚研院CV大佬代季峰跳槽商汤为哪般?

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;知乎上一篇离开关于MSRA&#xff08;微软亚洲研究院&#xff09;和MSRA CV未来发展的帖子讨论热度颇高&#xff0c;这个帖子以MSRA CV执行研究主任代季峰离职加入商汤为引子&#xff0c;引…

iOS Block实现探究

2019独角兽企业重金招聘Python工程师标准>>> 使用clang的rewrite-objc filename 可以将有block的c代码转换成cpp代码。从中可以看到block的实现。 #include <stdio.h> int main() {void (^blk)(void) ^{printf("Block\n");};blk();return 0; } 使…

CUDA Samples: Long Vector Add

以下CUDA sample是分别用C和CUDA实现的两个非常大的向量相加操作&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;各个文件内容如下&#xff1a;common.hpp:#ifndef FBC_CUDA_TEST_COMMON_HPP_ #define FBC_CUDA_TEST_COMMON_HPP_#include<random>template&l…

TensorFlow2.0正式版发布,极简安装TF2.0(CPUGPU)教程

作者 | 小宋是呢转载自CSDN博客【导读】TensorFlow 2.0&#xff0c;昨天凌晨&#xff0c;正式放出了2.0版本。不少网友表示&#xff0c;TensorFlow 2.0比PyTorch更好用&#xff0c;已经准备全面转向这个新升级的深度学习框架了。本篇文章就带领大家用最简单地方式安装TF2.0正式…

javascript全栈开发实践-准备

目标&#xff1a; 我们将会通过一些列教程&#xff0c;在只使用JavaScript开发的情况下&#xff0c;实现一个手写笔记应用。该应用具有以下特点&#xff1a; 全平台&#xff0c;有手机客户端&#xff08;Android/iOS&#xff09;&#xff0c;Windows&#xff0c;macOS&#xff…

POJ 1017 Packets 贪心 模拟

一步一步模拟&#xff0c;做这种题好累 先放大的的&#xff0c;然后记录剩下的空位有多少&#xff0c;塞1*1和2*2的进去 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #incl…

NLP被英语统治?打破成见,英语不应是「自然语言」同义词

&#xff08;图片付费下载自视觉中国&#xff09;作者 | Emily M. Bender译者 | 陆离责编 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 【导读】在NLP领域&#xff0c;多资源语言以英语、汉语&#xff08;普通话&#xff09;、阿拉伯语和法语为代表&#…

CUDA Samples: Dot Product

以下CUDA sample是分别用C和CUDA实现的两个非常大的向量实现点积操作&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;各个文件内容如下&#xff1a;common.hpp:#ifndef FBC_CUDA_TEST_COMMON_HPP_ #define FBC_CUDA_TEST_COMMON_HPP_#include<random>templa…