Прерывая epoll_wait с событием non-IO, никакими сигналами

Текущий сценарий является epoll_wait по нескольким fds и очереди возможных входящих сообщений, я хотел бы, чтобы цикл ниже epoll_wait был выполнен на событии IO или на новом сообщении.
Путями я знаю:

  • Используйте a time тайм-аут msec и проверка очередь первая вещь в цикле
  • Используйте прием самоканала от кода очереди, когда сообщения станут доступными
  • Прервите syscall стандартным сигналом
  • Используйте epoll_pwait и совершенствуйте предыдущую точку

Ни одна из точек, отправленных выше, не удовлетворяет меня достаточно, и я задавался вопросом, существуют ли какие-либо другие методы, которые я не нашел.
Причины:

  • Сигналы - что-то для предотвращения на многопоточном коде и не очень надежны
  • Тайм-аут каждый удаляет часть преимущества epoll, только просыпающегося с событиями
  • Прием самоканала смотрит лучший подход в настоящий момент, но все еще слишком много шаблона

идеи?

9
задан Arkaitz Jimenez 11 February 2010 в 12:49
поделиться

2 ответа

Вы можете использовать eventfd, что фактически является тем же самым, что и трюк self-pipe, только с меньшим количеством файловых дескрипторов и меньшим количеством шаблонов (например, в glibc есть удобные функции eventfd_read/write).

19
ответ дан 4 December 2019 в 10:32
поделиться

Вы перечислили события, которые могут разбудить epoll, поэтому вопрос действительно таков: «Как мне уменьшить шаблон для трюка self-pipe?»

Ответ на этот вопрос действительно зависит от вашего кода, языка и того, что вы пытаетесь сделать. Я предполагаю, что у вас есть поток, который обрабатывает ввод-вывод, и вы хотите выполнять другую работу в этом потоке, пока нет готового ввода-вывода. В коде, который управляет циклом epoll, он может иметь внутренний дескриптор, который предоставляется другим частям системы как функция «пробуждения» или «отправка работы».

Для этого существуют библиотеки, например boost.asio для C ++. Однако нетрудно написать свой собственный, если вы просто ориентируетесь на epoll, и объем фактического шаблонного кода должен быть минимальным, если у вас есть класс / модуль / все, что связано с циклом epoll.

1
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: