我有一个 aysnc 线程池模型用于网络连接管理。一个持续调用 poll() 的单个调度程序线程和一个工作线程池 一旦 poll() 表明如此,就读/写。
考虑这样一种情况,poll() 指示套接字已准备好读取。但工作线程还没有处理读取。当工作线程尚未处理读取时,我禁用读取轮询。现在远程端断开连接并 poll() 以 POLLERR/POLLHUP 返回。当工作线程在此之后调用 read() 时会发生什么?
read()是否返回<0 even though there is some data that hasn't been read yet? Or
即使套接字具有 POLLERR/POLLHUP,read() 是否也会从网络读取数据?
所有待处理的数据将在
read()
返回零之前交付。但是,如果 read()
返回 -1,则待处理的数据可能已丢失。
现在远程端断开连接,poll() 返回 POLLERR/POLLHUP。当工作线程在此之后调用 read() 时会发生什么?
POLLER
、POLLHUP
和 POLLIN
不是排他性的。只要 poll()
调用导致 POLLIN
位被设置,您就可以读取数据。这是因为数据存储在系统缓冲区中,因此调用 read()
旁边的 poll()
只会复制可用的内容。 (也就是说,您当然也应该检查read()
错误)
将
POLLIN
与其他位一起设置是完全可以的,因此正确的做法是简单地检查它是否已设置并在这种情况下忽略其他位。处理完 POLLIN
后,您应该能够处理其他位 😊
请注意,在某些情况下,尽管设置了 read()
,但
POLLIN
可能会返回零。但它与
POLLHUP
/PULLERR
无关。
我希望没关系,但是FWIW我没有完全理解以下引用:当工作线程尚未处理读取时,我禁用读取轮询。现在远程端断开连接,poll() 返回 POLLERR/POLLHUP。
“禁用读取轮询”是什么意思,是指您已停止轮询吗?如果停止轮询,为什么会有返回值……?