2

本文的“更多等待...”部分中,当作者谈到与线程同步 i/o 时,他给出的第一个示例是:

hFile = CreateFile(....,FILE_IO_OVERLAPPED,...);
ReadFile(hFile,...)
< Do some computation.>
WaitForSingleObject(hFile,INFINITE);

我的印象是“CreateFile”和“ReadFile”都是同步API,不是吗?为什么这里需要一个“WaitForSingleObject”?'CreateFile' 和 'ReadFile' 不会阻塞直到操作结束然后返回?

然后,当作者谈到“警报等待”时,会出现更多的混乱。它是什么,WaitForSingleObjectEx() 之后的线程状态?那么为什么作者给出:

while (WaitForSingleObject(hObject,TRUE)==WAIT_IO_COMPLETION);

作为例子而不是

while (WaitForSingleObjectEx(hObject,TRUE)==WAIT_IO_COMPLETION);

?

并且应该将“ex”功能放在一起,例如:

hFile = CreateFile(....,FILE_IO_OVERLAPPED,...);
ReadFileEx(hFile,...)
< Do some computation.>
while (WaitForSingleObjectEx(hObject,TRUE)==WAIT_IO_COMPLETION);

任何人都可以解释一下吗?

谢谢,

4

4 回答 4

3

好吧,您引用了代码,但显然没有阅读它:-) “重叠 IO”是异步的。

至于警报等待,我认为它们并不经常使用。

于 2012-09-10T12:32:38.493 回答
2

该文件还指出:

异步 I/O 是操作系统提供的一种让 I/O 指令在后台执行的方式,其想法大致是对 ReadFile 或 WriteFile 的调用将立即返回给调用者,并将 I/O 操作本身与计算重叠首先调用它的线程。 此技术仅适用于其驱动程序支持异步 I/O 并通过可传递给 CreateFile 调用的标志 FILE_IO_OVERLAPPED (*)向程序员显示自身的 I/O 设备。在此类文件对象上执行的 I/O 的行为与同步 I/O 的行为完全不同。

这些方法是同步/异步的,具体取决于传递给 CreateFile 的参数

*应为 FILE_FLAG_OVERLAPPED

于 2012-09-10T12:34:58.303 回答
2

这些都是相当多的问题。

我的印象是“CreateFile”和“ReadFile”都是同步 API,不是吗?

两者都是真的。这取决于您传递给 Create/Read FileFunction 的参数。你可以在这里阅读更多关于它的信息。一个简短的摘录:

... 如果 hFile 是用 FILE_FLAG_OVERLAPPED 打开的,它是一个异步文件句柄;否则它是同步的....

对于您的第二个问题,我想WaitForSingleObject应该是错误的WaitForSingleObjectEx

是否使用 Ex 版本的功能取决于您是否需要 Ex 版本的附加功能。尽管如果您将它们混合在代码中,我认为这是一种不好的风格。

于 2012-09-10T12:38:59.743 回答
0

阅读以下文档ReadFile()

此函数设计用于同步和异步操作。

ReadFile()如果FILE_FLAG_OVERLAPPED被传递到CreateFile()并且OVERLAPPED结构被传递到,则为异步ReadFile(),例如:

hFile = CreateFile(..., FILE_IO_OVERLAPPED, ...); 
...
OVERLAPPED ol = {0};
ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!ReadFile(hFile, ..., &ol))
{
    if (GetLastError() != ERROR_IO_PENDING)
    {
        // error... 
    }
}
...
WaitForSingleObject(ol.hEvent, INFINITE); // or GetOverlappedResult(hFile, &ol, ..., TRUE);
于 2012-09-10T22:57:22.183 回答