在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);
任何人都可以解释一下吗?
谢谢,
答案 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()
的
如果将此功能适用于同步和异步操作。
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);