Ich bin auf Windows XP ausgerichtet, und ich brauche eine Funktion ähnlich GetTickCount64, die nicht überläuft.Thread-sichere GetTickCount64-Implementierung für Windows XP
Ich konnte keine anständige Lösung finden, die korrekt und Thread-sicher ist, also habe ich versucht, mein eigenes zu rollen.
Hier ist, was ich kam mit:
ULONGLONG MyGetTickCount64(void)
{
static volatile DWORD dwHigh = 0;
static volatile DWORD dwLastLow = 0;
DWORD dwTickCount;
dwTickCount = GetTickCount();
if(dwTickCount < (DWORD)InterlockedExchange(&dwLastLow, dwTickCount))
{
InterlockedIncrement(&dwHigh);
}
return (ULONGLONG)dwTickCount | (ULONGLONG)dwHigh << 32;
}
Ist es wirklich Thread-sicher?
Thread-Sicherheit ist schwierig, um die Richtigkeit zu überprüfen, so dass ich nicht sicher bin, ob es wirklich in allen Fällen richtig ist.
Nein, das ist nicht Thread-sicher. –
Es ist nicht einmal richtig. Ihr Aufruf an "InterlockedIncrement" ist bestenfalls eine Vermutung. Sie scheinen auch "volatile" zu verwenden, um etwas anderes zu meinen als es: [volatile vs. volatile] (http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484). – IInspectable
Danke für Ihre Kommentare. Ich denke, ich muss noch etwas über die Lock-Free-Programmierung lernen. Nun, ich habe versucht :) In der Tat, löste ich mein Problem auf andere Weise ... Durch nichts zu tun :) Es scheint, dass bei der Berechnung der Unterschied zwischen zwei GetTickCount Ergebnisse, 49-Tage-Überlauf nicht wirklich die Ergebnisse vermasseln (außer der Zeitunterschied ist so groß). http://stackoverflow.com/a/3692425/2604492 – Paul