我可以同时等待 GUI 事件(即泵送消息循环)和 I/O 完成端口吗?我想将 libuv 与 Windows GUI 集成。
问问题
335 次
1 回答
3
我知道有两种解决方案。一种适用于所有版本的 Windows,但涉及多个线程。另一个更快,但仅支持 Windows 10+(感谢@RbMm 提供这一事实)。
另一个线程循环调用
GetQueuedCompletionStatusEx
,并使用 . 向主线程发送消息SendMessage
。主线程从它的消息循环中读取消息,记录自定义消息类型,并分派 I/O 完成。此解决方案适用于所有版本的 Windows,但速度较慢。但是,如果愿意以延迟换取吞吐量,则可以增加
GetQueuedCompletionStatusEx
接收缓冲区以恢复与第二种解决方案几乎相同的吞吐量。为获得最佳性能,两个线程应使用相同的 CPU,以避免在 I/O 完成时玩缓存乒乓。主线程用于
MsgWaitForMultipleObjectsEx
等待完成端口发出信号或用户输入到达。一旦发出信号,主线程就会GetQueuedCompletionStatusEx
以零超时调用。这假设只有一个线程使用的 IOCP 会在 I/O 完成到达时准确地发出信号。这仅适用于 Windows 10 及更高版本。否则,您将忙于循环,因为 IOCP 将始终收到信号。在支持这种方法的系统上,它应该更快,因为它减少了调度开销。
于 2018-01-26T18:44:40.550 回答