首页
社区
课程
招聘
[讨论]完成端口CompletionKey和lpOverlapped
发表于: 2013-8-16 10:46 3714

[讨论]完成端口CompletionKey和lpOverlapped

2013-8-16 10:46
3714
CreateIoCompletionPort和GetQueuedCompletionStatus,这2个API提供了完成端口模型

运行的动力,其工作原理也不难理解,但是有2个参数,使我很迷惑,查阅了一些资料和前辈们的

大作,可惜都没对这个问题有深入的讲解,到底它们设计的真滴是什么呢?


HANDLE WINAPI CreateIoCompletionPort(
										HANDLE FileHandle,
										HANDLE ExistingCompletionPort,
										ULONG_PTR [COLOR="Red"]CompletionKey[/COLOR],
										DWORD NumberOfConcurrentThreads
									 );



一看到“Key”,自然而然就会想到与之对应的Value,再看它的数据类型又是ULONG,一个整数型(我知道所有数据类型都是浮云,内存中只有1字节,2字节,4字节),如果说CreateIoCompletionPort在内部维护着一个像Map那样的数据结构,我认为是合乎逻辑的。

但是目前在网上流传的实例中,全部都是在这个参数上传入一个自定义结构体指针,这看上去不那么优雅,又不符合Microsoft设计API的习惯,就拿GetQueuedCompletionStatus来说吧:


BOOL WINAPI GetQueuedCompletionStatus(
  __in          HANDLE CompletionPort,
  __out         LPDWORD lpNumberOfBytes,
  __out         PULONG_PTR [COLOR="Red"]lpCompletionKey[/COLOR],
  __out         LPOVERLAPPED* [COLOR="Red"]lpOverlapped[/COLOR],
  __in          DWORD dwMilliseconds
);



微软API的习惯是如果需要用户传入指针,就会把参数直接设计成指针类型,而不会做成ULONG再让用户强制类型转换。

话又说回来,上面我猜测:一个文件句柄对应一个索引,也说不通,因为微软并没有提供通过这个索引来获取与之对应文件句柄的API呀.

再说说我对重叠IO的疑惑,这个结构体如今大家都知道可以扩展,可以加入一些用户层感兴趣的数据,那么如果完成键做成一个自定义结构体,保存着用户层感兴趣的数据,重叠IO也做同样的工作,这意义又何在呢?

也有前辈说重叠IO只保存核心层感兴趣的数据,完成键保存用户层感兴趣的数据,这种说法貌似有条理了,可是把完成键做成数据结构指针和扩展重叠IO结构,这好像都是我们在灵活使用,而微软
当初设计完成端口模型的时候,并不是这样做的,而他们原来的设计思想和标准的模型编写思路又是什么样子呢?

还请前辈高人们,解惑

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//