2012-09-10 49 views
2

this article,部分“更多的等待......”,当笔者谈到同步I/O与线程,第一个例子,他给人的是:与调用线程同步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); 

任何一个可以解释一下?

感谢,

回答

2

该文件还指出以下几点:

异步I/O是一种操作系统提供了让 I/O指令在后台执行,这个想法遭到了粗暴的 是对ReadFile呼叫或WriteFile将立即返回到 调用者,并将I/O操作本身与计算 的线程重叠,该线程首先调用它。该技术仅适用于其驱动程序支持异步I/O的I/O设备,并且通过可传递给CreateFile调用的标志FILE_IO_OVERLAPPED 向程序员证明其自身。在这样的文件对象上执行的I/O将表现得与同步I/O完全不同。

的方法是根据传递到的CreateFile

+0

感谢。 Yossarian我在这个问题上太粗心了 – user1559625

3

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

至于警戒等待,我不认为他们经常使用。

+0

愚蠢的我是:(因为错过了 'FILE_IO_OVERLAPPED' 谢谢基督教 – user1559625

2

这些参数同步/异步是相当多的问题。

我觉得'CreateFile'和'ReadFile'都是同步API,不是吗?

两者都是如此。它取决于您传递给Create/Read FileFunction的参数。 你可以阅读更多关于它here。一个简短的摘录:

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

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

如果使用功能的防爆型,或者如果你需要的防爆型与否的附加功能不依赖。尽管如果你将它们混合在你的代码中,我认为它是不好的风格。

+0

没有一个'WaitFor ...()'函数支持文件句柄作为输入,对于重叠的I/O,你必须使用带有等待事件的OVERLAPPED结构通过'CreateEvent()'代替,那么你可以等待事件,而不是文件可怕ctly。 –

0

Read the documentationReadFile()

该功能被设计用于同步和异步操作。

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);