Jestem ukierunkowana na system Windows XP i potrzebuję funkcji podobnej do funkcji GetTickCount64, która nie przepełnia.Bezpieczna dla wątków implementacja GetTickCount64 dla systemu Windows XP
Nie mogłem znaleźć przyzwoitego rozwiązania, które jest poprawne i bezpieczne dla wątków, więc spróbowałem wykonać własne.
Oto co wymyśliłem:
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;
}
Czy naprawdę wątku bezpieczne?
Bezpieczeństwo gwintów jest trudne do sprawdzenia pod względem poprawności, więc nie jestem pewien, czy jest to poprawne we wszystkich przypadkach.
Nie, to nie jest bezpieczny wątku. –
To nawet nie jest poprawne. Twoje wezwanie do "InterlockedIncrement" jest w najlepszym wypadku zgadywaniem. Wydaje się również, że używasz 'volatile' do oznaczania czegoś innego niż to: [volatile vs. volatile] (http://www.drdobbs.com/parallel/volatile-vs- volatile/212701484). – IInspectable
Dzięki za komentarze. Sądzę, że muszę jeszcze nauczyć się kilku rzeczy o programowaniu bez blokady. No cóż, próbowałem :) Naprawiłem mój problem w inny sposób ... Nie robiąc nic :) Wydaje się, że przy obliczaniu różnicy między dwoma wynikami GetTickCount, 49-dniowe przepełnienie naprawdę nie psuje wyników (chyba że różnica czasu jest tak duża). http://stackoverflow.com/a/3692425/2604492 – Paul