2013-05-19 2 views
0

В использовании 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 событий, что произойдет?

ответ

2

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

Единственное интересное соображение, о котором я могу думать, - это когда у вас есть несколько потоков, прочитанных с одного и того же epoll-fd одновременно. В этом случае размер вашего массива событий определяет, сколько событий обрабатывается одним потоком (т. Е. Меньшее число может дать вам больший параллелизм).

+0

Даже для событий EPOLLET они все равно могут быть получены в более позднем звонке? как многие потоки могут использовать один и тот же epoll-fd, не нужны мьютекс? – misteryes

+0

@misteryes: ET/LT не имеет ничего общего с размером массива. ET/LT определяет, когда происходит событие. 'epoll_wait' всегда, в конце концов, сообщит обо всех событиях, которые произошли, только в небольших кусках за раз. –

+0

@misteryes: Чтение из epoll-fd является поточным, пока все события «одноразовые». Тогда их гарантируют, что они будут опробованы точно в одном потоке. –

Смежные вопросы