Mining-Technical-Details

為什麼比特幣挖礦程式碼有兩次相同的if語句?

  • April 10, 2016

來自 v0.9.3 miner.cpp 源(<https://github.com/bitcoin/bitcoin/blob/v0.9.3/src/miner.cpp#L598-L604>):

if (GetTimeMillis() - nHPSTimerStart &gt; 4000)
{
   static CCriticalSection cs;
   {
       LOCK(cs);
       if (GetTimeMillis() - nHPSTimerStart &gt; 4000)
       {
       ....

為什麼相同的if語句“ if (GetTimeMillis() - nHPSTimerStart &gt; 4000)”執行了兩次?GetTimeMillis() 只能上升,所以看起來如果第一個為真,那麼第二個語句也只能評估為真,而且沒用。不過,我假設這並不完全正確,並且還假設它與CCriticalSelection, 但想更好地理解它的性質。

謝謝!

這是雙重檢查鎖定,即

…一種軟體設計模式,用於通過首先測試鎖定標準 […] 而無需實際獲取鎖來減少獲取鎖的成本。

這種模式可能充滿問題。即使是那些知道自己在做什麼的人也可能被微妙的問題所困擾。例如,參見Scott Meyers 和 Andrei Alexandrescu的 C++ 和雙重檢查鎖定的危險。

不過,您引用的特定案例看起來相當無害。

引用自:https://bitcoin.stackexchange.com/questions/32878