网上说的太宏观,自己测试一下各种情况,FD为nonblock。
0.客户端发送新数据过来,单线程阻塞在epoll_wait,epoll_wait返回可读事件。
1.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件。
2.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件开始读数据,同时客户端不再发送数据过来,并且缓冲区的数据没有读完,线程继续epoll_wait,不会返回可读事件。
3.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件开始读数据,同时客户端继续发送新数据过来,并且缓冲区的数据循环读取直到客户端不发了,线程继续epoll_wait,不会返回可读事件。
4.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件开始读数据,同时客户端不再发送数据过来,并且缓冲区的数据没有读完,线程继续epoll_wait,此时客户端继续发送新数据过来,返回可读事件。
5.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件开始读数据,同时客户端不再发送数据过来,并且缓冲区的数据没有读完,但是用EPOLL_CTL_MOD重新绑定客户端FD的EPOLLIN | EPOLLET到EPOLL_FD上面,线程继续epoll_wait,返回可读事件。
6.多线程阻塞在epoll_wait,客户端一次性发送新数据过来(理想情况),一个线程返回可读事件。
7.多线程阻塞在epoll_wait,客户端一次性发送新数据过来(理想情况),一个线程返回可读事件,该线程开始缓慢读数据,同时客户端继续一次性发送新数据过来,另一个线程返回可读事件。
8.多线程阻塞在epoll_wait,客户端一次性发送新数据过来(理想情况),一个线程返回可读事件,该线程开始快速读数据,同时客户端继续一次性发送新数据过来,另一个线程不会返回可读事件。
9.多线程阻塞在epoll_wait,客户端分批次发送新数据过来(实际情况有缓冲区大小,网络拥塞等原因限制导致分批),多个线程返回可读事件。
总结:有新数据来或者进行epoll_ctl( 缓冲区有数据剩余)会触发读事件,第8点比较奇怪,原因可能是线程读数据太快了,其他线程感知不到缓冲区来了新数据。