Ho appena scritto la seguente parte di codice (in delphi):
procedure Update(Value: Integer);
begin
// If the last update was yesterday, replace yesterday value
if CompareDate(FLastUpdate,Now) <> 0 then
begin
FYesterdayValue := FTodayValue;
end;
FTodayValue := Value;
FLastUpdate := Now;
end;
E ho capito che contiene una condizione di gara piccola, ma reale. Immagina che la prima volta che viene chiamata la funzione "Ora" sia un millisecondo prima di mezzanotte, l'istruzione if viene saltata e il timestamp viene aggiornato con un'altra chiamata a "Ora", che è ora un millisecondo DOPO mezzanotte. Ora il timestamp ha il valore sbagliato e il valore FYesterdayValue non ottiene il valore corretto.
In pratica, penso che le possibilità che questo accada mai sono quasi inesistenti perché a) il codice è tipicamente chiamato ~ 1 / minuto eb) il tempo di CPU tra le due chiamate sarà ESTREMAMENTE piccolo.
Tuttavia è un bug e sono curioso di correggerlo se ci si è imbattuti in un progetto.