[問題] encapsulation的應用(C)

作者: zzss2003 (brotherD)   2018-06-29 11:58:32
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"嗎?
想請教各位前輩是不是我誤會了什麼?謝謝
作者: bluesoul (忙死你老爸)   2018-06-29 12:06:00
第二段code迴圈的部分沒有保護
作者: sarafciel (Cattuz)   2018-06-29 13:20:00
他那段話不是在否定use the same of semaphore這件事簡單的講就是 你不知道用你的code的人是雷包還是大師那麼讓他們去寫semaphore 你也不知道他們寫得對不對還不如你自己實作正確的同步函式給他們call比較好講同步不太精確....應該說可平行化

Links booklink

Contact Us: admin [ a t ] ucptt.com