在Windows上,为什么libuv将I / O回调调用推迟到下一轮循环?

时间:2019-02-11 12:31:42

标签: libuv

根据documentation,libuv在循环的POLL阶段执行I / O回调,然后执行任何“检查”回调。

  
      
  1. I / O的循环块。此时,循环将阻止上一步计算的超时的I / O。正在监视给定文件描述符以进行读或写操作的所有与I / O相关的句柄,此时都将其回调称为
  2.   

在Linux上是正确的。但是对于Windows,情况有所不同-libuv将I / O回调推迟到下一轮。您可以从source code推断出这一点。

success = GetQueuedCompletionStatusEx(loop->iocp,
                                      overlappeds,
                                      ARRAY_SIZE(overlappeds),
                                      &count,
                                      timeout,
                                      FALSE);

if (success) {
  for (i = 0; i < count; i++) {
    /* Package was dequeued, but see if it is not a empty package
     * meant only to wake us up.
     */
    if (overlappeds[i].lpOverlapped) {
      req = uv_overlapped_to_req(overlappeds[i].lpOverlapped);
      uv_insert_pending_req(loop, req);  <---------------------- WHAT?
    }
  }

如果您不明白我的意思,请在Windows和Linux上尝试demo program并比较结果。

为什么行为不同?我不明白看起来像是设计选择,如果可以,为什么?

(此问题最初发布为here。很长时间没有得到任何回复,我决定重新发布。)

0 个答案:

没有答案