OO第二單元電梯作業總結

2022-08-30 06:48:11 字數 2169 閱讀 1230

三次電梯作業,從實現單部多執行緒、相同的多部多執行緒到可以處理增加電梯請求的不同多部多執行緒電梯,是乙個對多執行緒程式設計從無到有的指南。

多執行緒程式設計的優勢和用處不必多說,在oo&os理論課上老師都已有詳盡的闡釋。整體而言,在個人學習的體會中,多執行緒程式設計的難點集中在:

多執行緒概念的理解

包括:...

併發執行時執行緒不安全問題的解決

死鎖的處理

我遇到了對於wait()情況判定過於籠統導致的無限wait,notify不上的情況。修改wait()和notify()條件,使之適配即可。

電梯排程演算法的優化

多執行緒程式的除錯與測試

測試方法其實在討論區和討論課上各位大佬們都有介紹。列舉一下:

實話實說,測試部分我僅僅停留在能夠編寫python使批量輸入帶時間戳的請求,其餘的包括自動輸出檢查、自動構建隨機或特殊樣例、演算法效率分析等相關方面並未涉及;而演算法優化我全程使用指導書上的基本演算法als,對於其他更優的演算法僅停留在了解層面,還未實現。

究其原因,主要是前面兩部分的難點在理解和挖掘方面很是遲鈍,尤其第二點執行緒不安全給我製造了較多的困難,並無足夠的精力應付測試/演算法優化。具體分析在文末反思裡。

單執行緒可稍帶,總體難度並不大,核心在於:

採用生產者-消費者設計模式,輸入請求為生產者,電梯為消費者,排程器是倉庫。

第一次作業難度較低也體現在設計架構上的簡單。總體來講,本次架構比較合理,電梯類中集中了較多方法,但都較為內聚,複雜度不高。和第一單元作業相比較能看出較為明顯的進步。

本次主要問題集中在對als演算法的不明確,導致效能上的極具下降,強測出現ctle。

互測時測試自己的中測的所有出問題的資料,未發現別人的問題。

多部可稍帶。主要難點在多部電梯執行緒之間競爭導致的執行緒不安全。

本次**整體架構仍然採用生產者-消費者的設計模式,總體仍是比較清晰且合理的。

具體來說:

增加了以下需求:

可在執行時增加電梯

電梯停靠樓層和執行時間存在差異

主要難度在於對於多種電梯型別的管理和排程

三次作業,我自己感受和反映在評測裡的結果都是相當失敗的。每次草草寫完程式之後漫長、無章法的針對執行緒不安全的debug使我在過程中感到無力而又對自己惱火。失敗的經驗攢了一箱,大致列舉如下:

在動手程式設計前沒有明確具體需求

比如第五次作業中測時,天真地以為als演算法只限同層入情況的捎帶。這種失誤對於整體設計而言是致命的。在動手程式設計前,務必明確設計要求,最好能夠列出提綱,事無鉅細的把需求落在實處,在設計過程中逐一實現、後期不斷疊加。

對於自己程式整體架構的不明晰

debug之路漫漫,其中乙個主要原因落在自己每次開始程式編寫時腦子裡只有整體大致架構,具體的小架構和細節實現依靠程式設計環節落實;編寫完成後,程式在頭腦裡是碎片化的、是零散的,編寫樣例進行測試就成了開獎環節,憑空扎針,構建系統而完整的覆蓋式的樣例測試幾乎是天方夜譚。

其實早在計組p5及之後,我惰於編寫樣例的問題就已經顯露。當時依靠同學之間交換的測試樣例勉gou強yan偷can生chuan;但果然,僥倖往往只有一次。

先設計架構清楚再編寫,我再給自己敲一回鐘。

初始對於基礎概念的輕視

多執行緒程式設計是對原來單執行緒的程式設計思路的一次不大不小的顛覆。顛覆必然意味著基礎、根本上的改變。第一次作業開始編寫時,我對執行緒協作的概念整體只有乙個模糊的認識。對於wait/notify方法、sleep方法以及鎖與互斥機制的深入了解都是在程式的一次次問題中獲得,可謂效率奇低,給自己無端製造過多障礙。

惰於編寫自動測試程式

多執行緒的固有特點導致其測試難度相較於多執行緒來說顯著增大。僅依靠手動輸入測試/debug並不可取。然而,也是由於在其他環節浪費較多時間,我並沒有進行有效的自動測試/類評測機搭建。事實上,雖然看上去省去(?)了搭建自動測試的時間,實際編寫樣例、debug環節所花費的時間不知翻了它幾倍。既讓自己喪失了通過搭建自動測試學習新東西的機會,又效率極低。

跌的跟頭多了,至少在失敗上有了很多經驗;再失敗也能迎著困難而上,拍拍土,再從地上爬起來。希望之後的自己能夠引以為戒,從教訓中獲得更多的成長,盡快走出困境。

OO第二單元作業總結

0.前言 轉眼間物件導向課程已經到了第二階段了,在第二階段裡共發布了三次pta程式設計作業,本次部落格主要針對於這三次作業的總結。作業過程總結,oo設計心得,測試的理解與實踐,課程收穫,對課程的建議。1.作業過程總結 總結三次作業之間的知識迭代關係 第一次作業 水文資料校驗及處理 蒙特卡羅方法求圓周...

OO第二單元多執行緒電梯總結

第一次作業要求完成單部可捎帶電梯的模擬。第一次作業中,我對於多執行緒程式設計理解還不深刻,只能先模仿實驗課練習的規範寫。我採用了經典的生產者 消費者模型,由input執行緒產生請求,放入排程器物件requestqueue中,然後由elevator執行緒從中取出請求執行。在排程器放入 取出請求以及結束...

OO第二單元 多執行緒電梯

elevator request兩個執行緒。elevator執行緒主要負責乘客的接送和進出。request執行緒是接收乘客資訊。control是緩衝器,用來儲存elevator和request兩個執行緒共享的乘客佇列。以電梯當前樓層和執行狀態為基準,如果電梯是上行的,並且高於當前樓層還有乘客要進出就...