同时等待 GUI 事件和 IOCP 通知

Waiting for GUI events and IOCP notifications at once

我可以等待 GUI 事件——即,发送消息循环——并同时在 I/O 完成端口上吗?我想将 libuv 与 Windows GUI 集成。

我知道有两种解决方案。一个适用于 Windows 的所有版本,但涉及多个线程。另一个更快,但只支持 Windows 10+(感谢@RbMm 提供的这个事实)。

  1. 另一个线程循环调用GetQueuedCompletionStatusEx,用SendMessage向主线程发送消息。主线程从它的消息循环中读取消息,记录自定义消息类型,并调度 I/O 完成。

    此解决方案适用于 Windows 的所有版本,但速度较慢。但是,如果愿意以延迟换取吞吐量,可以增加 GetQueuedCompletionStatusEx 接收缓冲区以恢复与第二种解决方案几乎相同的吞吐量。为了获得最佳性能,两个线程应使用相同的 CPU,以避免在 I/O 完成时播放缓存乒乓球。

  2. 主线程使用MsgWaitForMultipleObjectsEx等待完成端口收到信号或用户输入到达。一旦收到信号,主线程就会调用 GetQueuedCompletionStatusEx,超时为零。

    这假设只有一个线程使用的 IOCP 在 I/O 完成到达时准确地发出信号。这仅适用于 Windows 10 及更高版本。否则,您将忙于循环,因为 IOCP 将始终发出信号。在支持此方法的系统上,它应该更快,因为它减少了调度开销。