Sono destinato a Windows XP e ho bisogno di una funzione simile a GetTickCount64, che non abbia overflow.Implementazione GetTickCount64 thread-safe per Windows XP
Non riesco a trovare una soluzione decente che sia corretta e thread-safe, così ho provato a rollare il mio.
Ecco cosa mi è venuta:
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;
}
E 'davvero thread-safe?
La sicurezza del filo è difficile da controllare per la correttezza, quindi non sono sicuro che sia veramente corretto in tutti i casi.
No, che non è thread-safe. –
Non è nemmeno corretto. La tua chiamata a "InterlockedIncrement" è un'ipotesi al meglio. Sembra anche che tu stia usando "volatile" per significare qualcosa di diverso da quello che fa: [volatile vs. volatile] (http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484). – IInspectable
Grazie per i vostri commenti. Credo di non aver ancora imparato una cosa o due sulla programmazione senza blocco. Beh, ho provato :) In effetti, ho risolto il mio problema in un altro modo ... Non facendo nulla :) Sembra che quando si calcola la differenza tra due risultati GetTickCount, 49 giorni di overflow non rovini i risultati (a meno che la differenza di orario sia così grande). http://stackoverflow.com/a/3692425/2604492 – Paul