[問題] encapsulation的應用(C)

看板C_and_CPP (C/C++)作者 (brotherD)時間7年前 (2018/06/29 11:58), 7年前編輯推噓0(0018)
留言18則, 2人參與, 7年前最新討論串1/1
source: an embedded software primer 1ed by Simon 正確的code: https://ideone.com/pRhTMU 錯誤的code: https://ideone.com/M2ZRJB 很明顯地可以看出這兩段程式碼的差別在於: 一個有用函式lSecondsSinceMidnight把變數 lSecondsToday包起來,一個是直接對變數lSecondsToday做access的動作。 這兩段code都有用semaphore把lSecondsToday給包起來。 作者說第二種錯誤的方式會有bug,但,既然都已經用semaphore把lSecondsToday包起來了 ,怎麼會有bug的發生呢?為什麼要多用一層lSecondsSinceMidnight把變數給包起來? 打到這裡突然看到作者說的一段話: At least some of bugs stem from undisciplined use: allowing code in many diffe- rent modules to use the same semaphore and hoping that they all use it correct- ly. You can squash there bugs before they get crawling simply by hiding the semaph- ore and the data that is protects inside of a module, thereby encapsulating bo- th. 作者說把semaphore與semaphore要保護的data放在module裡可以防止"code in many diff- erent modules to use the same semaphore". 但...在第一種正確的方式,function vHackerTask與vJuniorProgrammerTask都呼叫同一 個function lSecondsSinceMidnight,不也是"use the same semaphore"嗎? 想請教各位前輩是不是我誤會了什麼?謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.85.243 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1530244718.A.D72.html

06/29 12:06, 7年前 , 1F
第二段code迴圈的部分沒有保護
06/29 12:06, 1F
有,迴圈上有comment,有說hope junior remembers to use the semaphore

06/29 13:20, 7年前 , 2F
他那段話不是在否定use the same of semaphore這件事
06/29 13:20, 2F

06/29 13:23, 7年前 , 3F
簡單的講就是 你不知道用你的code的人是雷包還是大師
06/29 13:23, 3F

06/29 13:26, 7年前 , 4F
那麼讓他們去寫semaphore 你也不知道他們寫得對不對
06/29 13:26, 4F

06/29 13:26, 7年前 , 5F
還不如你自己實作正確的同步函式給他們call比較好
06/29 13:26, 5F

06/29 13:28, 7年前 , 6F
講同步不太精確....應該說可平行化
06/29 13:28, 6F
其實我認為這段不是在表達這個意思。GetSemaphore與GiveSemaphore都是廠商提供的fun- ction,作者是站在"function的使用者"的角度去表達這段話 ※ 編輯: zzss2003 (60.251.49.183), 06/29/2018 17:59:39

06/30 13:51, 7年前 , 7F
"hope junior remembers" 你怎麼會理解成他有保護....
06/30 13:51, 7F

06/30 13:55, 7年前 , 8F
他裡面那三個.c檔 是不同的人在寫的code
06/30 13:55, 8F

06/30 13:59, 7年前 , 9F
第一個vtimertask()只是跟你示意說lSecondsToday需要被
06/30 13:59, 9F

06/30 14:01, 7年前 , 10F
保護 所以後面hacker跟junior這兩個想使用它的時候
06/30 14:01, 10F

06/30 14:02, 7年前 , 11F
應該也要用semphore保護 問題是他不知道hacker跟junor
06/30 14:02, 11F

06/30 14:04, 7年前 , 12F
他們會不會加 或著是寫一寫忘記這個變數是該被保護的結
06/30 14:04, 12F

06/30 14:04, 7年前 , 13F
果沒加 那最保險的做法就是他們要用的時候封裝成一個
06/30 14:04, 13F

06/30 14:08, 7年前 , 14F
function去保護變數
06/30 14:08, 14F

06/30 14:11, 7年前 , 15F
至於use the same semaphore 我換個角度跟你講
06/30 14:11, 15F

06/30 14:15, 7年前 , 16F
我把變數包起來 跟把整個迴圈 甚至整個main包起來
06/30 14:15, 16F

06/30 14:17, 7年前 , 17F
這些也都是use the same semaphore 問題是後面兩個
06/30 14:17, 17F

06/30 14:18, 7年前 , 18F
會把semaphore拿著太久 造成其他thread不必要的等待
06/30 14:18, 18F
謝謝你的解釋,我不懂的原因是因為我卡在這句英文: At least some of those bugs stem from undisciplined use: allowing code in many different modules to use the same semaphore and hoping that they all use it correctly. 我一開始把"允許不同module內的code使用一樣的semaphore"認為是undisciplined use, 仔細看了一遍,原來作者的意思是"允許不同module內的code使用一樣的semaphore,且希 望他們正確地使用"這一整段話才是undisciplined use。 ※ 編輯: zzss2003 (60.251.49.183), 07/02/2018 13:59:34
文章代碼(AID): #1RDQvkro (C_and_CPP)
文章代碼(AID): #1RDQvkro (C_and_CPP)