Это связано с моим предыдущим вопросом, где я спросил, должно ли std::chrono::steady_clock::now
быть noexcept
. Теперь, когда я знаю, что мне следует задаться вопросом, как эта функция сообщает об ошибках? Например, обычная реализация этой функции в Linux использует clock_gettime, что может возвращать ошибку. .
Как std::chrono::steady_clock::now сообщает об ошибках?
Ответы (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 для установки времени.
Это не так. В API нет возможности сообщать об ошибках. Таким образом, реализация Linux должна либо обрабатывать ошибки внутри, либо не возвращать (например, через exit()
или std::terminate()
).
steady_clock
. Я понятия не имею, действительно ли какие-либо реализации делают это.
- person GManNickG; 07.08.2013
time_point
изменялись с постоянной скоростью относительно реального времени. от 20.11.7.2/1 [время.часы.неподвижно].
- person Casey; 07.08.2013