Mining-Technical-Details
為什麼比特幣挖礦程式碼有兩次相同的if語句?
來自 v0.9.3 miner.cpp 源(<https://github.com/bitcoin/bitcoin/blob/v0.9.3/src/miner.cpp#L598-L604>):
if (GetTimeMillis() - nHPSTimerStart > 4000) { static CCriticalSection cs; { LOCK(cs); if (GetTimeMillis() - nHPSTimerStart > 4000) { ....
為什麼相同的if語句“
if (GetTimeMillis() - nHPSTimerStart > 4000)
”執行了兩次?GetTimeMillis() 只能上升,所以看起來如果第一個為真,那麼第二個語句也只能評估為真,而且沒用。不過,我假設這並不完全正確,並且還假設它與CCriticalSelection
, 但想更好地理解它的性質。謝謝!
這是雙重檢查鎖定,即
…一種軟體設計模式,用於通過首先測試鎖定標準 […] 而無需實際獲取鎖來減少獲取鎖的成本。
這種模式可能充滿問題。即使是那些知道自己在做什麼的人也可能被微妙的問題所困擾。例如,參見Scott Meyers 和 Andrei Alexandrescu的 C++ 和雙重檢查鎖定的危險。
不過,您引用的特定案例看起來相當無害。