select () - способные таймеры - PullRequest
10 голосов
/ 24 февраля 2010

select () - отличный системный вызов. Вы можете упаковать любое количество файловых дескрипторов, дескрипторов сокетов, каналов и т. Д. И получать уведомления синхронно, когда ввод станет доступен.

Есть ли способ создать интервал / однократный таймер и использовать его с select ()? Это избавило бы меня от необходимости иметь несколько потоков для ввода-вывода и синхронизации.

Ответы [ 4 ]

12 голосов
/ 24 февраля 2010

timerfd_create делает именно это. Это довольно недавнее дополнение к ядру Linux, и оно может быть доступно не во всех дистрибутивах.

7 голосов
/ 25 февраля 2010

Используйте параметр timeout - храните события таймера в очереди с приоритетами, проверяйте верхний элемент и соответственно устанавливайте время ожидания - если время ожидания истекло, вы можете проверить, что событие готово к запуску, запустить событие и продолжить .

По крайней мере, так я и делаю.

Обратите внимание, что опрос имеет более приятный интерфейс (в некоторых отношениях) и может быть более эффективным с большим количеством файловых дескрипторов.

2 голосов
/ 23 июля 2011

MarkR имеет хорошее портативное решение, но вот другое:

Используйте таймер POSIX (timer_create), и вы можете преобразовать проблему в «select -поддерживаемые сигналы». Эта проблема имеет классическое решение: запись в канал из обработчика сигнала и select ing на конце чтения канала.

0 голосов
/ 04 ноября 2017

Опираясь на @MarkR, используя отсортированную структуру для хранения обратного вызова + замыкания с int и указателем на int. Если два целых имеют одно и то же значение, то событие активно, иначе оно было отброшено.

Таким образом, события можно отбрасывать, просто увеличивая int. Возможно, не самое простое решение, но это было все, что я мог придумать.

https://github.com/cheako/tor2web/tree/6ac67f80daaea01d14a5d07e6026e1af4258dc96/src

hextree.c contains the code for the data structure used.
schedule.c:156 is where the int is changed.
gnutls.c:197 is where the timers are created.
...