Nano Hash - криптовалюты, майнинг, программирование

sleep_until момент времени в прошлом

У меня есть то, что я считал простым шаблоном: я хочу сделать точку времени на 5 секунд в будущем, запустить задачу, которая может занять некоторое время, а затем спать до этой точки времени (возможно, вообще не спать, если это время уже достигнуто) .) Однако всякий раз, когда я пытаюсь использовать std::this_thread::sleep_until с моментом времени в прошлом, мое приложение вместо этого зависает навсегда. Вот MCVE:

#include <chrono>
#include <thread>

int main(){
  std::this_thread::sleep_until(std::chrono::steady_clock::now() - std::chrono::seconds(1));
}

Используя g++ (GCC) 4.8.5, это никогда не возвращается. Я также пробовал system_clock с теми же результатами. Используя strace для изучения того, что происходит, последнее, что я получаю, это:

nanosleep({4294967295, 0},

поэтому я думаю, что в конце концов он вернется, но я не хочу ждать так долго.

Это баг g++? Я не могу представить, что такое поведение является преднамеренным. Я нашел вопрос Хорошо ли определено поведение, когда sleep_until() указывает момент времени в прошлом? но не похоже, что на самом деле был сделан какой-либо вывод о том, действительно ли стандарт указывает, что должно произойти. С тех пор я реализовал другое решение моей проблемы; Мне просто любопытно, является ли то, что я вижу, UB или ошибкой.



Ответы:


1

Похоже на ошибку:

30.2.4 Спецификации синхронизации [thread.req.timing]

4 Функции, имена которых заканчиваются на _­until, принимают аргумент, указывающий момент времени. Эти функции производят абсолютные тайм-ауты. Реализации должны использовать часы, указанные в момент времени, для измерения времени для этих функций. Для аргумента точки времени Ct точка времени возврата из тайм-аута должна быть Ct+Di+ Dm, когда часы не настраиваются в течение тайм-аута. (...)

Где Di определяется как задержка «качества реализации», а Dm определяется как задержка «качества управления».

Как блестяще подчеркивает Говард Хиннант, реализация должна стремиться чтобы минимизировать Di и Dm:

30.2.4 Спецификации синхронизации [thread.req.timing]

2 Реализации обязательно имеют некоторую задержку возврата после тайм-аута. Любые служебные данные в ответе на прерывание, возврате функции и планировании приводят к задержке «качества реализации», выражаемой как продолжительность Di. В идеале эта задержка должна быть равна нулю. Кроме того, любое соперничество за ресурсы процессора и памяти вызывает задержку «качества управления», выражаемую как продолжительность Dm. Длительность задержки может варьироваться от тайм-аута к тайм-ауту, но в любом случае чем короче, тем лучше.

Обратите внимание, что это должно быть истинным независимо от значения Ct, и что бесконечная задержка определенно не является минимальной.

Небольшое обновление: это теперь исправлено, начиная с версии 4.9.3. Вот информация об отслеживании ошибок.

08.08.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..