Вдохновленный последней секундой координации, я исследовал время (, в частности, интервальные таймеры ), используя вызовы POSIX.
POSIX предоставляет несколько способов установки таймеров, но все они проблематичны :
sleep
. и nanosleep
— их перезапуск после прерывания сигналом раздражает, и они вносят рассогласование часов. Вы можете избежать некоторых, но не всех, этих перекосов, проделав дополнительную работу, но эти функции используют часы реального времени, так что здесь есть подводные камни.setitimer
или более современные timer_settime
— они разработаны как интервальные таймеры, но они относятся к процессу -, что является проблемой, если вам нужно несколько активных таймеров. Их также нельзя использовать синхронно, но это не так важно.clock_gettime
и clock_nanosleep
кажутся правильным ответом при использовании с CLOCK_MONOTONIC
. clock_nanosleep
поддерживает абсолютные тайм-ауты, так что вы можете просто заснуть, увеличить тайм-аут и повторить. Таким же образом легко перезапустить после прерывания. К сожалению, эти функции также могут быть специфичными для Linux -, :они не поддерживаются в Mac OS X или FreeBSD.pthread_cond_timedwait
доступен на Mac и может работать с gettimeofday
в качестве неуклюжего обходного пути, но на Mac он может работать только с часами реального времени, поэтому он может работать некорректно, когда установлены системные часы или происходит дополнительная секунда.Есть ли API, который мне не хватает? Существует ли достаточно переносимый способ создания интервальных таймеров с хорошим -поведением в UNIX-системах, подобных -, или это суммирует положение дел на сегодняшний день?
Под хорошим -поведением и достаточно портативным я подразумеваю:
Примечание о дополнительных секундах(в ответ на ответ Р..):
Дни POSIX длятся ровно 86 400 секунд, но настоящие -мировые дни редко бывают длиннее или короче. Как система разрешает это несоответствие, определяется реализацией -, но для дополнительной секунды обычно используется та же отметка времени UNIX, что и для предыдущей секунды. См. также:Високосные секунды и что с ними делать .
Ошибка ядра Linux с дополнительной секундой возникала из-за того, что не выполнялась уборка после перевода часов на секунду назад :https://lkml.org/lkml/2012/7/1/203.. Даже без этой ошибки часы прыгнули бы назад на одну секунду.