В использовании Epoll, это, как правило, как следующее:maxevents параметр в epoll_wait() и массив событий размера
struct epoll_event ev,events[20];
epfd=epoll_create(256);
。。。
nfds=epoll_wait(epfd,events,40,500);
Некоторые статьи говорят о том, что параметр maxevents
в epoll_wait
(а именно 40
в epoll_wait(epfd,events,40,500);
) должны не превышать параметр размера в epoll_create
(а именно 256
).
Я думаю, что параметр maxevents
не должен превышать 20
в ev, events[20]
, поскольку события могут быть зарегистрированы только до 20 элементов событий; в противном случае, если есть 40 сокетов, которые активны, то что будет?
BTW, если я зарегистрирую более 20 сокетов и более 20 активных событий (сокетов), но массив событий events[20]
имеет только 20 событий, что произойдет?
Даже для событий EPOLLET они все равно могут быть получены в более позднем звонке? как многие потоки могут использовать один и тот же epoll-fd, не нужны мьютекс? – misteryes
@misteryes: ET/LT не имеет ничего общего с размером массива. ET/LT определяет, когда происходит событие. 'epoll_wait' всегда, в конце концов, сообщит обо всех событиях, которые произошли, только в небольших кусках за раз. –
@misteryes: Чтение из epoll-fd является поточным, пока все события «одноразовые». Тогда их гарантируют, что они будут опробованы точно в одном потоке. –