Как std::chrono::steady_clock::now сообщает об ошибках?

Это связано с моим предыдущим вопросом, где я спросил, должно ли std::chrono::steady_clock::now быть noexcept. Теперь, когда я знаю, что мне следует задаться вопросом, как эта функция сообщает об ошибках? Например, обычная реализация этой функции в Linux использует clock_gettime, что может возвращать ошибку. .


person vitaut    schedule 07.08.2013    source источник


Ответы (2)


Все ошибки, о которых может сообщить средство Linux clock_gettime, невозможны в отлаженной реализации std::chrono::steady_clock::now().

Ошибки:

int clock_gettime(clockid_t clk_id, struct timespec *tp);


EFAULT

tp указывает вне доступного адресного пространства.

Пользователь не может ошибиться в tp в std::chrono::steady_clock::now(). Если std::chrono::steady_clock::now() передает неверный tp в clock_gettime, это просто ошибка в steady_clock, которую легко исправить.

EINVAL

Указанный clk_id не поддерживается в этой системе.

Пользовательский clk_id не может ошибиться в std::chrono::steady_clock::now(). Если std::chrono::steady_clock::now() передает неверный clk_id в clock_gettime, это просто ошибка в steady_clock, которую необходимо исправить.

Обратите внимание, что переносимость реализации steady_clock не гарантируется, и, возможно, ее придется переносить на любую данную платформу и проверять на корректность. Может оказаться, что steady_clock не может быть реализовано в терминах clock_gettime на некоторых платформах.

EPERM

clock_settime() не имеет права устанавливать указанные часы.

Неприменимо к steady_clock, так как нет API для установки времени.

person Howard Hinnant    schedule 07.08.2013
comment
Большое спасибо за ответ. Как насчет Windows, где часы обычно реализуются с использованием QueryPerformanceCounter, который может возвращать документацию, которая, похоже, не перечисляет случаи ошибок? - person vitaut; 07.08.2013
comment
Извините, я не знаком с Windows. Я вижу эту проблему LWG, в настоящее время в статусе NAD Будущее: cplusplus.github.io /LWG/lwg-closed.html#935 - person Howard Hinnant; 07.08.2013

Это не так. В API нет возможности сообщать об ошибках. Таким образом, реализация Linux должна либо обрабатывать ошибки внутри, либо не возвращать (например, через exit() или std::terminate()).

person Casey    schedule 07.08.2013
comment
Реализация также может хранить последнее успешное значение и просто возвращать его в случае, если она не может получить доступ к реальным часам. Это удовлетворяет монотонному требованию steady_clock. Я понятия не имею, действительно ли какие-либо реализации делают это. - person GManNickG; 07.08.2013
comment
@GManNickG Это относится к внутренним ошибкам обработки, но не соответствует (по крайней мере, в принципе) требованию, чтобы значения time_point изменялись с постоянной скоростью относительно реального времени. от 20.11.7.2/1 [время.часы.неподвижно]. - person Casey; 07.08.2013