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!
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.
Nick Odell
#bitcoin-dev
zu überprüfen.Greg Hewgill
nHPSTimerStart
?Morsecoder
Floris
if
prüft, ob wir uns die Mühe machen sollten, die möglicherweise teure Sperre vorzunehmen. Wenn ja, dann sperren wir und jetzt, dassnHPSTimerStart
sich garantiert nichts ändert, können wir das sicherif
wieder ausführen.Morsecoder