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();
...
}

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

...全文
656 点赞 收藏 回复
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复

还没有回复,快来抢沙发~

发动态
发帖子
Windows SDK/API
创建于2007-08-02

1202

社区成员

C++ Builder Windows SDK/API
申请成为版主
社区公告
暂无公告