Std::chrono now() вызывает очень значительное отклонение в Ubuntu 24.04 под WSL2C++

Программы на C++. Форум разработчиков
Anonymous
Std::chrono now() вызывает очень значительное отклонение в Ubuntu 24.04 под WSL2

Сообщение Anonymous »

У меня есть алгоритм, который я использую уже много лет для эмуляции часов реального времени в среде, не работающей в режиме реального времени. Он всегда работал исключительно хорошо, пока не был использован в Ubuntu 24.04 в WSL2 в Windows 11. Логика предсказывает по системному времени, когда должен произойти каждый следующий временной шаг, и неоднократно вызывает функцию now() в цикле до тех пор, пока не будет достигнут этот момент времени, а затем продолжает выполнение следующего кадра. При настройке в этой среде возвращаемое значение now() иногда будет значительно смещаться вперед во времени (например, примерно на 25 секунд) между последовательными вызовами. Простое наблюдение за запуском приложения показывает, что дело не в том, что now() возвращает значение примерно за 25 секунд, поскольку все приложение завершится примерно за 5 секунд, тогда как должно было занять около 30. Подразумевается, что вызов now() фактически изменил время на часах. Чтобы убедиться в этом, я включил свой пример кода в сценарий bash, где я мог отслеживать и повторно синхронизировать часы WSL... now() действительно изменяет время часов.
Пример кода был построен в этой среде с использованием g++ и clang++, C++17 и C++20. Тот же эффект наблюдается во всех четырех случаях.
Пример кода работает правильно без изменения времени часов на машине под управлением Ubuntu-24.04 (более старая версия аппаратного обеспечения) и под Windows11. /WSL2/Ubuntu-22.04 (идентичное аппаратное обеспечение)
Я нашел бесчисленное количество сообщений, обсуждающих проблему отклонения тактовой частоты Linux при работе под WSL. Большинство утверждают, что «решили» проблему путем повторной синхронизации с аппаратными часами. Это не «исправляет» проблему дрейфа, а просто сбрасывает ее. Где-то в системе явно глюк, может ли это быть связано? Is now() в некоторых конфигурациях WSL, влияющих на время, и это мой крайний случай, когда я вбиваю now() в цикл, просто произнося проблему. Как это исправить?
воспроизводимый пример кода:

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 

void print(std::chrono::duration elapsed_seconds,
std::chrono::_V2::system_clock::time_point,
std::chrono::duration error);

int main()
{
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79010308/stdchrono-now-induces-very-significant-drift-with-ubuntu-24-04-under-wsl2[/url]

Вернуться в «C++»