2016-01-02 7 views
2

Если один поток (скажем, X) ждет на epoll_wait(), то другой поток (скажем Y) делает вызов epoll_ctl(), чтобы зарегистрировать интерес к файловому дескриптору 9. Может ли предыдущий вызов epoll_wait() в потоке X вернуть дескриптор файла 9 добавлен по теме Y? Первоначальный вызов epoll_wait() никогда не возвращался посередине в любой точке.Может ли epoll или kqueue обрабатывать асинхронные добавления файловых дескрипторов к себе

Теперь я хочу сравнить это и задать связанные вопросы в отношении двух других вызовов опроса в операционных системах. poll() и kqueue

  1. Если ответ на этот вопрос верно, то есть способ добиться подобного поведения с poll() системного вызова?
  2. Предположим, что epoll_ctl() является потокобезопасным, а нить X может безопасно звонить epoll_ctl() и имеет вызов epoll_wait(), если дескриптор файла 9 готов для ввода-вывода. Разделение функции для объявления интереса к файловому дескриптору и функции ожидания - вот что сделало бы эту функцию потрясающей. Но люди часто ссылаются на kqueue и epoll как используемые для той же функциональности. Однако kqueue не имеет отдельной функции, чтобы объявлять интерес в получении обратной связи для дескриптора. Кто-нибудь знает, как kqueue может использоваться так же, как epoll? epoll, кажется, лучший вариант THREADSAFE там прямо сейчас, если это позволяет THREADSAFE «процентную декларацию»
+1

С 'kqueue' вы можете * объявить интерес * без * получать события обратной связи *, передавая 0 как параметр 'nevents'. См., Например, [этот ответ] (http://stackoverflow.com/questions/5756402/how-do-replace-select-with-kevent-for-higher-performance) – Tsyvarev

ответ

2

От man epoll_wait:

В то время как один поток блокируется при вызове epoll_pwait(), это возможно для другого потока добавить файловый дескриптор в экземпляр ожидаемого экземпляра epoll. Если новый дескриптор файла будет готов, это вызовет вызов epoll_wait() для разблокирования.

So epoll_wait часы для файлового дескриптора, добавленные во время ожидания.

Такое поведение невозможно выполнить с помощью poll()/select(), поскольку они считывают набор дескрипторов файлов один раз, поэтому нельзя изменять набор описаний файлов, которые в настоящее время опрошены.

[Конечно, если вы передаете дескриптор файла, созданного epoll_create к poll()/select(), модификации этого дескриптора файла будет отслеживаться как с epoll_wait.]

+0

Я не знал, что есть 'epoll_pwait'. В чем разница между' epoll_wait() 'и' epoll_pwait() '? – Curious

+1

Хм, это похоже на опечатку на странице руководства: в том же предложении он использует 'epoll_pwait' и' epoll_wait', в то время как фактически означает ту же функцию. 'epoll_pwait' отличается от' epoll_wait' тем, что он дополнительно позволяет заданный набор сигналов во время выполнения. См. Man для более подробной информации. – Tsyvarev

+0

'epoll_pwait' - это не опечатка, это вариант' epoll_wait', который позволяет управлять безопасностью обработки сигналов. Подробнее [здесь] (http://linux.die.net/man/2/epoll_pwait). – Myst