将I/O与调用线程同步
Synchronize I/O with calling thread?
在本文的"更多等待…"一节中,当作者谈到用线程同步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);
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在另一个线程中调用luaL_error会引发qWarning
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 如何从线程中的不同模块调用函数?
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 是否可以创建一个从不同类调用函数的线程?
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 非静态成员失败的线程调用函数
- 线程调用的函数对对象删除是否安全?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 通过 Qt 中的线程调用 Rust 库
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 由并发无序映射查找线程调用的函数是否安全?
- 每个线程 C++ 保护以防止重入函数调用
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 线程 std::调用未知类型,无法专门化函数错误
- 工作线程一直在等待,condition_variable甚至调用了notify_all