Существуют ли интервальные таймеры POSIX с хорошим -поведением?

Вдохновленный последней секундой координации, я исследовал время (, в частности, интервальные таймеры ), используя вызовы 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-системах, подобных -, или это суммирует положение дел на сегодняшний день?

Под хорошим -поведением и достаточно портативным я подразумеваю:

  • Не склонен к перекосу часов (минус, конечно,собственный перекос системных часов)
  • Устойчивость к установке системных часов или появлению дополнительной секунды
  • Возможность поддержки нескольких таймеров в одном процессе
  • Доступно как минимум для Linux, Mac OS X и FreeBSD

Примечание о дополнительных секундах(в ответ на ответ Р..):

Дни POSIX длятся ровно 86 400 секунд, но настоящие -мировые дни редко бывают длиннее или короче. Как система разрешает это несоответствие, определяется реализацией -, но для дополнительной секунды обычно используется та же отметка времени UNIX, что и для предыдущей секунды. См. также:Високосные секунды и что с ними делать .

Ошибка ядра Linux с дополнительной секундой возникала из-за того, что не выполнялась уборка после перевода часов на секунду назад :https://lkml.org/lkml/2012/7/1/203.. Даже без этой ошибки часы прыгнули бы назад на одну секунду.

18
задан Community 23 May 2017 в 11:47
поделиться