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"嗎?
想請教各位前輩是不是我誤會了什麼?謝謝