将I/O与调用线程同步

Synchronize I/O with calling thread?

本文关键字:调用 线程 同步      更新时间:2023-10-16

在本文的"更多等待…"一节中,当作者谈到用线程同步i/o时,他给出的第一个例子是:

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

我的印象是"CreateFile"answers"ReadFile"都是同步API,不是吗?为什么这里需要"WaitForSingleObject"?在操作结束然后返回之前,"CreateFile"answers"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);

有人能再解释一下吗?

谢谢,

好吧,您引用了代码,但显然没有阅读:-)"Overlapped IO"是异步的。

至于警觉性等待,我不认为它们经常被使用。

该文档还说明了以下内容:

异步I/O是操作系统提供的一种方式I/O指令在后台执行,其想法大致如下对ReadFile或WriteFile的调用将立即返回到调用程序,并将I/O操作本身与最初调用它的线程。仅此技术适用于驱动程序支持异步I/O和通过标志FILE_IO_OVERLAPPED(*)显示给程序员可以传递给CreateFile调用。在这样的文件对象的行为将与同步I/O截然不同。

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

*应读取FILE_FLAG_OVERLAPPED

这些问题很多。

我的印象是"CreateFile"answers"ReadFile"都是同步API,不是吗?

两者都是真的。它取决于传递给创建/读取文件函数的参数。你可以在这里阅读更多关于它的信息。一个短暂的优势:

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

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

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

阅读ReadFile():的文档

此函数是为同步和异步操作而设计的。

如果FILE_FLAG_OVERLAPPED被传递给CreateFile(),而OVERLAPPED结构被传递给了ReadFile(),则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);