Измерьте время, пока объект std :: future не станет доступным - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь измерить продолжительность вызова API, который возвращает объект std::future.

Мой текущий подход выглядит следующим образом:

std::chrono::high_resolution_clock::time_point endTime, startTime = std::chrono::high_resolution_clock::now();

std::shared_future<API::response> responseFuture = API::request();

std::future_status status = responseFuture.wait_for(3s); // Some Timeout

if (status == std::future_status::ready)
  endTime = std::chrono::high_resolution_clock::now();
else
  // error handling

Однако я не уверен насчет использования std::future::wait_for. cppreference.com состояния:

Эта функция может блокироваться дольше, чем timeout_duration, из-за задержек планирования или конфликта ресурсов.

Меня не беспокоит блокировка дольше, чем timeout_duration, но я требую wait_for для немедленного возврата, как только объект std::future станет доступным, то есть не имеет реализации, аналогичной

while(!ready){
  std::this_thread::sleep_for(10ms);
}

Гарантируется ли это?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Функция вернется, когда общее состояние будет готово или истечет время ожидания (плюс бит). Согласно [futures.unique.future] / 21, эффект функции равен

Нет, если в общем состоянии содержится отложенная функция ([futures.async]), в противном случае блокируется до общего состояние готово или пока не истечет относительное время ожидания ([thread.req.timing]), указанное в rel_time.

выделение шахты

И [thread.req.timing] имеет

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

Функции, имена которых заканчиваются на _for, принимают аргумент, который задает продолжительность. Эти функции производят относительные таймауты. Реализации должны использовать устойчивые часы для измерения времени для этих функций.326 При заданном аргументе продолжительности Dt продолжительность времени в реальном времени составляет Dt+Di+Dm.

Который говорит о дополнительном добавленном времени, которое может быть добавлено к таймауту до фактического возврата функции.

1 голос
/ 26 марта 2020

Вы работаете в вытесняющей многопоточной среде; ничего не происходит "немедленно". После того, как вы передаете свой временной интервал ОС, блокируя (или украдя ваш временной), вы перестаете контролировать. ОС разблокирует ваш поток в какой-то момент после разблокировки мьютекса. ОС стараются быть в курсе этих вещей, но никаких гарантий нет.

Лучшее, на что вы можете надеяться, это «вскоре после». wait_for даст вам это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...