将I / O与调用线程同步?

时间:2012-09-10 12:27:24

标签: c++ multithreading winapi

this article中,“More Waiting ...”部分,当作者谈到将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 个答案:

答案 0 :(得分:3)

嗯,你引用了代码,但显然没有看到它:-)“Overlapped IO”是异步的。

至于可警觉的等待,我认为它们并不常用。

答案 1 :(得分:2)

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

  

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

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

* 应该读取FILE_FLAG_OVERLAPPED

答案 2 :(得分:2)

这些都是很多问题。

  

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

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

  

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

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

如果您使用Ex版本的功能取决于您是否需要Ex版本的附加功能。虽然我认为如果你把它们混合在你的代码中它是一种糟糕的风格。

答案 3 :(得分:0)

ReadFile()

Read the documentation

  

此功能适用于同步和异步操作。

如果将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);