为啥 GetQueuedCompletionStatus() 不返回操作类型?

Posted

技术标签:

【中文标题】为啥 GetQueuedCompletionStatus() 不返回操作类型?【英文标题】:Why GetQueuedCompletionStatus() does not return operation type?为什么 GetQueuedCompletionStatus() 不返回操作类型? 【发布时间】:2015-02-25 18:32:04 【问题描述】:

GetQueuedCompletionStatus()出列完成通知,但它不返回它是什么类型的通知(例如,读取通知,写入通知)。

我有责任跟踪我启动了哪些操作,例如,当我使用 WSARecv() 时,我在 OVERLAPPED 结构中添加一个标志,指示这是什么操作(在这种情况下读取),以及何时我出列通知,我读了这个标志。那么有谁知道GetQueuedCompletionStatus()为什么不返回操作的类型吗?

【问题讨论】:

因为您应该自己跟踪。你拿回来的指针就是你的钥匙。从 OVERLAPPED 派生出自己的结构来存储任何额外的上下文是很常见的。 实际操作与GQCS 无关。这取决于。它应该这样管理(作为每个 IO 状态的一部分,通常通过 OVERLAPPED 结构的扩展)。用于实际 IO 的 IOCP 编程(你也可以在没有 IO 的情况下使用它们)是一种状态机风格的编程,管理所说的状态。 【参考方案1】:

它为什么要关心?您可以通过 API 传递用户数据,从而通过GetQueuedCompletionStatus() 提取完成,那么您为什么还需要其他任何东西呢?由于您可以使用PostQueuedCompletionStatus() 发布自己的完成,因此您可以完成无限数量的“操作”,因此将其传递到“扩展的OVERLAPPED 结构中,您可以传递任何内容...

如果您可以传递自己的单独标志,那么它实际上并不会消除将额外的额外内容作为扩展 OVERLAPPED 结构传递的需要,因为能够传递数据缓冲区和其他信息以及无论如何操作,所以一个额外的标志不太值得拥有......我的设计需要的比你的设计需要的多,所以让我们处理 API 设计者给我们的方法......

【讨论】:

以上是关于为啥 GetQueuedCompletionStatus() 不返回操作类型?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?