【发布时间】:2016-08-16 00:03:37
【问题描述】:
我有一个基于反应器的设计,其中在epoll_wait 中轮询了许多套接字文件描述符。
为了优化延迟而不是吞吐量,当写入套接字时,我们会尝试立即直接写入文件描述符。
如果出现EWOULDBLOCK,我们会缓冲未写入的数据,然后等待套接字再次变为可写。
下次我们的epoll_wait 将我们的文件描述符返回为可写,然后我们从缓冲的数据中发送。
问题是,套接字能否在在我们收到EWOULDBLOCK 但在之前我们调用epoll_wait 之后变为可写?
也就是说,如果我们执行 2 个 write 调用,其中第一个 write 被部分写入,其余部分被缓冲,然后执行第二个 write,尝试立即写入,套接字是否可以在第一次和第二次写入调用之间变为可写,而我们最终会在远端接收到乱序数据?
【问题讨论】:
-
我没有得到你的关注。假设您没有尝试发送已经发送的数据并且没有做一些延迟的事情,例如尝试在没有任何同步的情况下在线程之间共享套接字,这将如何导致数据乱序?
-
@cHao 不,没有什么比非同步多线程更迟钝的了!请参阅
EJP我对以下答案的评论 - 我想是内核线程清空了我担心的套接字发送缓冲区。