BUAA OO 第二單元總結

2022-08-09 04:36:13 字數 2029 閱讀 6316

目錄多執行緒的經驗和教訓

這三次作業大致採用了相同的策略。

執行緒設計方面,都是乙個input(輸入器)執行緒,乙個controller(控制器)執行緒,若干個elevator(電梯)執行緒。互動方式上,主要通過鎖來進行同步控制。每部電梯有乙個自己的privatelock,這些privatelock對控制器也可見;同時控制器和所有電梯共享乙個publiclock,控制器和輸入器共享乙個inputlock。(第一次作業中,由於只有一部電梯,電梯與控制器之間只共享一把鎖。)

容器方面,前兩次作業是控制器和輸入器共享乙個list,每部電梯有自己的list;第三次作業是控制器對應a, b, c三種電梯有三個list,每部電梯有自己的list.

請求封裝成person物件,屬性有from, to, id, inelevator(是否在電梯內)。

執行緒執行方面:

由於三次作業設計類似,為了避免冗餘,以第三次作業為例進行分析。

作業3行數統計

作業3method

作業3class

作業3主要部分uml

作業3uml時序

第一次作業強測爆0,後兩次作業未被測出bug,這裡著重分析一下第一次作業。

第一次作業的問題主要在於沒有分清synchronized(lock)和lock.wait()的區別,把synchronized(lock)沒拿到鎖時也理解成了waiting狀態。這就導致電梯每執行一層,本應該把鎖交給控制器,但是有可能再次交給自己從而導致捎帶失敗。值得一提的是,由於這個bug的觸發是有一定隨機性的,所以在我的簡單測試中沒有顯現出來。週六下午我通過進一步測試發現了這個問題,但還是由於鎖機制理解不到位沒能成功修復,最後只能抱著沒準能過的想法提交,果然得到了乙個0分。

這次的bug一定程度上是因為首次接觸多執行緒程式不太適應,也給了我一些啟示。首先,在拿到乙個新東西的時候,如果感覺某個理論點存在理解上的模糊,一定要徹底弄明白再應用。其次,多測試、早測試,對於多執行緒程式來說更是如此,這次做得還是不夠好。最後,我充分理解了多執行緒程式「通過測試資料不代表沒bug,沒通過一定有bug」的特點,在後續評測機報錯而本地無法復現的時候,可以安心debug而不是懷疑評測機。

此外,在提交中測和自己測試的過程中,主要遇到過兩個問題。第乙個是某個lock在lock.lock()之後,進行了乙個分支語句,在else分支的最後忘了lock.unlock(),這一點在進行手動鎖控制的過程中需要尤其注意。 第二個是兩個執行緒同時notify對方,然後同時wait被對方notify,形成死鎖,可以通過設定wait的時間上限或者單開乙個執行緒定時notify來解決。

回到目錄

由於感覺這一單元的作業相對比較難,所以我花在自動測試上的時間較少。我只編寫了乙個定時投放資料的指令碼(因為如果沒有這個指令碼幾乎無法進行有效測試),而沒有寫資料生成和正確性判斷的指令碼。

第一次作業因為驚天大bug沒有進入互測。第二次作業因為沒有自動評測程式,有些自暴自棄,沒太認真參與互測。但是第二次作業的互測結束後,我檢視了其他同學hack成功的資料點,發現大家的資料都是手搓的而不是自動生成的。所以第三次互測我設計了5組資料,型別是:最後一條是換乘請求,測試是否因為提前關閉電梯導致最後一名乘客無法到達;電梯全部空閒一段時間後再輸入請求,測試是否會有相關的執行緒互動問題;50條指令同時到達的壓力測試;乘客請求與加電梯請求同時到達的執行緒安全測試;以加電梯請求結束的執行緒安全測試。讓我非常驚訝的是,這5組資料每一組都hack成功,且總共hack中7人次,這說明多執行緒的執行緒安全的確非常容易出問題。

回到目錄

BUAA OO 2022 第二單元總結

需求 整體設計 發現別人bug有 需求 整體設計 對所有同層 座的共享佇列進行加鎖,judgein 和personin 兩個相似的方法均對共享佇列進行加鎖,造成了邏輯上的冗餘 public boolean judgein else else if direction 0 return false 本...

BUAAOO第一單元總結

第一單元的作業是對多項式求導,三次作業分別完成了簡單冪函式表示式求導 帶簡單巢狀的表示式求導和三角函式求導 豐富巢狀的表示式求導及格式檢查。本人在第一次作業中使用的是正規表示式匹配和字串預處理相結合的方法,可以達到需要的效果,但是越過了格式約束並降低了可擴充套件性,導致第二次作業不得不重構。第二次作...

BUAA OO 第一單元總結

1 類關係圖 2 作業設計思路 3 類與方法內部分析 poly類 方法 4 優缺點分析 缺點 1 類關係圖 2 作業設計思路 分割表示式思路 優化表示式思路 a sin x 2 b cos x 2 a b sin x 2 b b a cos x 2 a a b cos x 2 a sin x 2 b...