std :: bedingte_variable :: wait_for, std :: thread :: sleep_for unter Windows sind von der Anpassung der Uhr betroffen

9

Nun. Ich habe Win10 x64 und diesen ziemlich einfachen Code:

%Vor%

Ja. Der Code funktioniert genau so, wie ich es erwarte. Es zeigt '!' jede Sekunde. Aber wenn ich meine Ortszeit ändere (minus 1 Stunde / Minute), dauert es ewig. Wenn ich cv.wait_for(...) durch WinAPI Sleep(1000) ersetze, funktioniert es gut. Auch WinAPI SleepConditionVariableCS funktioniert gut.

Ich habe es versucht:

%Vor%

Und es gibt mir das gleiche Ergebnis.

BTW: Das Verhalten der Aufrufe wie std::this_thread::sleep_for , std::this_thread::sleep_until ist gleich.

Die Frage ist also: Ist es möglich, std::condition_variable mit dem erwarteten Verhalten zu verwenden? Oder ich muss es nur durch meinen eigenen CONDITION_VARIABLE Wrapper ersetzen?

    
Sergio Pv 17.11.2017, 11:35
quelle

1 Antwort

12

Dies war ein bekannter Fehler mit VS2015 condition_variable , der leider ABI-break zu beheben ist. Ich habe es in unserer nächsten Hauptversion behoben (ich habe die Implementierung der Bedingungsvariablen von Grund auf neu geschrieben), aber ich weiß nicht, wann das als nächstes passieren wird. Beachten Sie, dass VS2017 eine Nebenversion war, soweit es die Standardbibliotheken betrifft.

Das Problem ist, dass der API-Vertrag, der von msvcp140.dll bereitgestellt wird, eine absolute Zeit gegenüber dem Systemtakt erwartet. Wenn sich also die Systemuhr ändert, ändert sich die effektive Wartezeit. Der Standard erlaubt die Implementierung eines instationären Takts aus einer stabilen Uhr heraus, aber nicht umgekehrt; Meine Vorgänger haben dieses Memo offenbar nicht bekommen:)

    
Billy ONeal 17.11.2017 21:40
quelle