Warum hat der Bitcoin-Mining-Code zweimal dieselbe if-Anweisung?

Aus der Quelle 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)
        {
        ....

Warum wird dieselbe if-Anweisung " if (GetTimeMillis() - nHPSTimerStart > 4000)" zweimal ausgeführt? GetTimeMillis() kann nur nach oben gehen, also scheint es, als ob, wenn die erste wahr ist, die zweite Anweisung immer nur als wahr ausgewertet werden kann und nutzlos ist. Ich gehe jedoch davon aus, dass dies nicht ganz richtig ist, und gehe auch davon aus, dass es etwas mit dem zu tun hat CCriticalSelection, möchte aber die Natur davon besser verstehen.

Vielen Dank!

Ich stimme zu, ich denke, das ist ein Copy-Paste-Fehler. Vielleicht sollten Sie fragen , um es noch einmal #bitcoin-devzu überprüfen.
Kann jeder andere Thread ändern nHPSTimerStart?
Ja, ich denke schon. Es könnte einige Threads geben, die am Mining arbeiten.
Ich habe etwas ähnliches schon einmal verwendet. Der erste ifprüft, ob wir uns die Mühe machen sollten, die möglicherweise teure Sperre vorzunehmen. Wenn ja, dann sperren wir und jetzt, dass nHPSTimerStartsich garantiert nichts ändert, können wir das sicher ifwieder ausführen.
Danke, Floris, das scheint vernünftig. Wenn Sie als Antwort posten, könnte ich es als solche markieren.

Antworten (1)

Dies ist eine doppelt geprüfte Verriegelung , das heißt

...ein Software-Entwurfsmuster, das verwendet wird, um den Aufwand für den Erwerb einer Sperre zu reduzieren, indem zuerst das Sperrkriterium getestet [...] wird, ohne die Sperre tatsächlich zu erwerben.

Dieses Muster kann mit Problemen behaftet sein; Sogar Leute, die sonst wissen, was sie tun, können von subtilen Problemen gebissen werden. Siehe zum Beispiel C++ and the Perils of Double-Checked Locking von Scott Meyers und Andrei Alexandrescu.

Der von Ihnen genannte spezielle Anwendungsfall sieht jedoch ziemlich harmlos aus.