ReadFile异步操作之猜想

cczlp 2007-12-27 08:58:57
前两天实现一个异步同步操作接口.估计ms的ReadFile也是类似这种方式实现的.
下面是我对ReadFile异步读取过程的猜测, 欢迎指正.

CreateFile时如果指定了FILE_FLAG_OVERLAPPED标志, 系统就创建一个线程, 等待后面的ReadFile和WriteFile.
ReadFile时给线程发送相关参数, 然后函数立刻返回, 线程接到参数后开始真正的读取操作, 完成后填写置OVERLAPPED结构并设置hEvent为有信号状态, 然后线程继续等待直到CloseHandle.

CreateFile,ReadFile函数都是对内核函数NtXXXX的封装, 这个线程也是在内核创建的.

实现过程:

NtCreateFile(...)
{
...
if (FILE_FLAG_OVERLAPPED)
NtCreateThread创建线程
....
}

NtReadFile(...)
{
...
if (异步)
{
SetEvent(hReadEvent);
return TRUE;
}
else return read(...);
}

ThreadFun()
{
while(!Terminated)
if (WaitForSingleObject(hReadEvent, -1) == WAIT_OBJECT_0)
{
OVERLAPPED.Internal = read(...);
...
SetEvent(OVERLAPPED.hEvent);
如果程序调用ReadFileEx,可能有CompletionRoutine回调函数, 在此调用
if (lpCompletionRoutine != NULL)
lpCompletionRoutine(...);
}
}

NtClose(Handle...)
{
TerminateThread();
...
}

如果线程优先级比正常优先级高, 那么异步就比同步快一些.

...全文
781 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧