https://blog.csdn.net/second60/article/details/81252106
https://blog.csdn.net/dog250/article/details/80837278
https://idea.popcount.org/2017-02-20-epoll-is-fundamentally-broken-12/
LT模式下同一事件会唤醒多个进程,当某个等待在epoll实例上的进程被唤醒后,最终会进入到ep_scan_ready_list() 这个函数中,ep_scan_ready_list()会以回调方式调用ep_send_events_proc()来将数据复制到用户空间。而ep_scan_ready_list()函数在返回之前会再次判断epoll的就绪链表rdllist是否为空,如果不为空的话,就会再唤醒其他进程!https://www.cnblogs.com/sduzh/p/6810469.html
ET模式下,非触发到触发两个状态转换的时候儿才触发,同一个事件前后的到来可能会唤醒不同的线程。
https://blog.csdn.net/dream0130__/article/details/104009426
其实LT与ET模式都是只唤醒一个线程,LT唤醒多个线程是因为被上一个线程唤醒,所以导致了依次唤醒。使用EPOLLEXCLUSIVE可以使得一个事件只会在一个epoll_wait上来唤醒。但是ET模式下不可以,只能使用so_reuseport,而且so_reuseport只能是在相同的地址与端口但是不同的socketfd下才会生效。
我刚才看了下其实LT与ET模式都是只唤醒一个线程,LT唤醒多个线程是因为可能被上一个线程ep_scan_ready_list()的时候唤醒,所以导致了依次唤醒,使用EPOLLEXCLUSIVE可以使得一个事件只会在当前epoll_wait上来唤醒。但是ET模式下不可以,ET在触发到非触发两个状态转换的时候,同一事件也可能唤醒其他线程,可以用EPOLLONESHOT每次都重新注册事件来解决。