Может epoll или kqueue обрабатывать асинхронные добавления файловых дескрипторов к себе
Если один поток (скажем, X) ожидает epoll_wait()
может другой поток (скажем, Y) делает вызов epoll_ctl()
зарегистрировать интерес в файловом дескрипторе 9
, Может ли предыдущий звонок epoll_wait()
в потоке X вернуть дескриптор файла 9
добавил по теме Y? Первоначальный вызов epoll_wait()
никогда не возвращался в середине в любой точке.
Теперь я хочу сравнить это и задать связанные вопросы по двум другим опросам в операционных системах. poll()
а также kqueue
- Если ответ на поставленный выше вопрос верен, то есть ли способ добиться аналогичного поведения с
poll()
системный вызов? - Давайте предположим, что
epoll_ctl()
является потокобезопасным, и поток X может безопасно вызватьepoll_ctl()
и позвонитьepoll_wait()
вернуть ли дескриптор файла9
готов к вводу / выводу. Разделение функции для объявления интереса к дескриптору файла и функции ожидания - вот что делает эту функцию удивительной. Но люди часто ссылаются наkqueue
а такжеepoll
как используется для той же функциональности. тем не мениеkqueue
не имеет отдельной функции для объявления заинтересованности в получении обратной связи по событию для дескриптора. Кто-нибудь знает какkqueue
может быть использован аналогичноepoll
?epoll
Кажется, на данный момент это лучший потокобезопасный вариант, если он допускает потокобезопасное "объявление процентов"
1 ответ
Хотя один поток блокируется при вызове epoll_pwait(), другой поток может добавить файловый дескриптор к ожидаемому экземпляру epoll. Если новый дескриптор файла станет готовым, он вызовет вызов функции epoll_wait().
Так epoll_wait
отслеживает добавленный файловый дескриптор, пока он ожидает.
Такое поведение не может быть достигнуто функцией poll()/select(), так как они читают набор файловых дескрипторов один раз, поэтому нельзя изменить набор файловых дескрипторов, которые в данный момент опрашиваются.
[Конечно, если вы передадите дескриптор файла, созданный epoll_create
в poll()/select()
, модификации этого файлового дескриптора будут отслеживаться как epoll_wait
.]