首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Win32重叠I/O - 完成例程还是WaitForMultipleObjects?

Win32重叠I/O - 完成例程还是WaitForMultipleObjects?

在Windows系统中,重叠I/O是一种用于执行非阻塞I/O的机制,它可以在等待I/O操作完成时同时进行其他操作。在C++中,使用overlapped关键字来表示一个重叠I/O操作,该操作可以通过CreateFile函数和ReadFileWriteFile等文件操作来创建。

在编写重叠I/O代码时,需要使用非阻塞文件操作,这些操作可以在操作未完成时立即返回,并且可以立即进行其他工作。当操作完成时,需要使用WaitForSingleObject函数等待操作完成。

WaitForMultipleObjects函数是Windows系统中的一个等待函数,可以等待多个对象(如文件、事件、线程等)完成或发生事件。在重叠I/O中,使用WaitForMultipleObjects函数等待操作完成是非常常见的。

总的来说,在重叠I/O中,需要使用非阻塞文件操作,并使用WaitForSingleObject函数等待操作完成。当需要等待多个对象完成时,可以使用WaitForMultipleObjects函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Windows内核原理-同步IO与异步IO

背景 在前段时间检查异常连接导致的内存泄漏排查的过程中,主要涉及到了windows异步I/O相关的知识,看了许多包括重叠I/O完成端口、IRP、设备驱动程序等Windows下I/O相关的知识,虽然学习到了很多东西...重叠的意思是执行I/O请求的时间与线程执行其他任务的时间是重叠的,即执行真正I/O请求的时候,我们的工作线程可以执行其他请求,而不会阻塞等待I/O请求执行完毕。...使用设备内核对象进行线程同步时,无法区分当前完成通知的I/O是读操作还是写操作,因此无论是读还是写都会将其状态设置为触发状态。...然后我们通过调用Win32 API就可以获取到对应的设备I/O完成请求通知,通知会将I/O完成请求从完成队列移除。...Windows支持原生的异步I/O。异步I/O也可以称为重叠I/O

1.8K10

设备驱动程序通知应用程序的几种方法

关键词 设备驱动程序 异步I/O Virtual Device Driver(VxD) Windows Driver Model(WDM)   在DOS操作系统中,应用程序可以直接与硬件打交道,包括I/...Win32应用程序收到消息后,对消息进行处理。 4 异步I/O方式   Win32应用程序首先调用CreateFile()函数加载设备驱动程序。...在调用该函数时,将倒数第2个参数设置为FILE_ATTRIBUTE_NORMAL FILE_FLAG_ OVERLAPPED,表示以后可以对文件进行重叠I/O操作。...设备驱动程序把这个I/O请求包(IRP)设置为挂起状态,并且设置一个取消例程。如果当前IRP队列为空,则将这个IRP传送给StartIo()例程;否则,将它放到IRP队列中。...它向上提供与硬件无关的用户接口,向下直接进行I/O、硬件中断、DMA和内存访问等操作。它将应用程序与硬件细节屏蔽开来,使软件不依赖于硬件并且可在多个不同的平台之间移植。

1.9K21
  • WDM 驱动程序开发

    2.WDM设备驱动程序的特点和原理2.1通用驱动程序对基本上一样的硬件,因为他们共享一个总线或完成类似的任务,设备驱动程序可以使用这些标准的驱动程序功能,使公共总线的共享容易,且更容易写出新的驱动程序,...(1)Win32程序接口: 可以使用Win32函数像访问文件那样访问设备CreateFile() 、Closehandle()、ReadFile()、WriteFile()、DeviceIoControl...2.3 IRP处理 I/O请求包IRP是驱动程序操作的中心,IRP是一个内核对象,它是预先定义好的数据结构,带有一组对它进行操作的I/O管理器例程I/O管理器接受一个I/O请求,然后将它传送到合适的驱动程序栈中的最高驱动程序之前...,分配并处始化一个IRP,每个I/O请求有主功能代码 2.4 IRP参数比如一个写的I/O请求转换成一个IRP时,I/O管理器填写主要的IRP首部,并构造第一个个栈单元,对写请求来讲,首部包含用户缓冲区信息...,一个驱动不一定要沿着设备栈向下传递IRP,如果自己能处理就就使用IoCompleteRequest完成IrP2.5 设备接口用户态使用Win32 CreateFile访问驱动程序,dwShareMode

    1.7K20

    c++ 网络编程(十)TCPIP LINUXwindows 异步通知IO模型与重叠IO模型 附带示例代码

    异步I/O(asynchronous I/O)由POSIX规范定义。...这种模型与前一节介绍的信号驱动模型的主要区别在于:信号驱动式I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。 示意图如下: ?...该系统调用立即返回,并且在等待I/O完成期间,我们的进程不被阻塞。本例子中我们假设要求内核在操作完成时产生某个信号,该信号直到数据已复制到应用进程缓冲区才产生,这一点不同于信号驱动I/O模型。 ?...等模型,重叠I/O(Overlapped I/O)模型使应用程序能达到更加系统性能 因为他和其他4种模型不同的是,使用重叠模型的应用程序通知缓冲区收发系统直接使用数据,也就是说,如果应用程序 投递了一个...2-重叠模型的基本原理 重叠模型是让应用程序使用重叠数据结构(WSAOVERLAPPED),一次投递一个或多个Winsock I/O请求,针对这些提交的 请求,在他们完成之后,应用程序会收到通知,于是就可通过自己的代码来处理这些数据了

    1.6K20

    WaitForMultipleObjects用法详解,一看就懂

    WaitForMultipleObjects是Windows中的一个功能非常强大的函数,几乎可以等待Windows中的所有的内核对象 函数原型为: DWORD WaitForMultipleObjects...对象保持未发信号的状态,但规定的等待超时时间已经超过  WAIT_OBJECT_0:所有对象都发出信号 WAIT_IO_COMPLETION:(仅适用于WaitForMultipleObjectsEx)由于一个I/...O完成操作已作好准备执行,所以造成了函数的返回 返回WAIT_FAILED则表示函数执行失败,会设置GetLastError 如bWaitAll为FALSE,那么返回结果相似,只是可能还会返回相对于WAIT_ABANDONED..._0或WAIT_OBJECT_0的一个正偏移量,指出哪个对象是被抛弃还是发出信号。...DWORD WINAPI MyThreadProc(LPVOID lpParam)     {      while(TRUE)      {  //每次等500毫秒    int nIndex = WaitForMultipleObjects

    3.3K70

    基于WDM的专用USB设备的驱动程序开发

    2 Win32驱动程序模型 USB设备驱动程序必须符合由Microsoft为Windows 98及其后版本所定义的Win32驱动程序模型(Win32 Driver Model,WDM)规格。...DDK usbioctl.h头文件源代码说明了如何定义和使用这些IOCTL,这些内部IOCTL实际上是利用Windows系统提供的ICO-CODE宏而由驱动程序开发人员新定义的I/O控制代码。...4.2驱动程序的组成及各部分主要功能 一个WDM设备驱动程序通常可以完成下面这些工作:⑴初始化;⑵创建、删除设备;⑶即插即用处理;⑷访问硬件;⑸处理电源管理;⑹使用WMI;⑺处理Win32 I/O及控制请求等等...它包含有一个驱动程序的初始化入口点:具有标准函数原型的DriverEntry例程。当驱动程序被装入时,内核调用这个例程。...DriverEntry例程的主要工作是在传递的驱动程序对象(DriverObject)中存储一系列回调例程的指针,以便于在分发例程中调用对应的例程来处理IRP。

    1.7K20

    c++ 网络编程(九)TCPIP LINUXwindows--使用IOCP模型 多线程超详细教程 以及 多线程实现服务端

    它是一种WIN32的网络I/O模型,既包括了网络连接部分,也负责了部分的I/O操作功能,用于方便我们控制有并发性的网络I/O操作。...当一个设备处理完I/O请求后,将会将这个完成后的I/O请求丢回IOCP的I/O完成队列。...如果成功则函数返回现有I / O完成端口的句柄。如果此参数为NULL,则该函数将创建一个新的I / O完成端口,如果FileHandle参数有效,则将其与新的I / O完成端口相关联。...备注:   CreateIoCompletionPort 提供这个功能:I/O系统可以被用来向列队的I/O完成端口发送I/O完成通知包。...当 你执行一个已经关联一个完成端口的文件I/O操作,I/O系统将会在这个I/O操作完成的时候向I/O完成端口发送一个完成通知包,I/O完成端口将以先 进先出的方式放置这个I/O完成通知包,并使用GetQueuedCompletionStatus

    3K20

    如何产生ioexception_结合实例论述控制过程

    I/O需要用到的结构体,临时记录IO数据 **/ const int DataBuffSize = 2 * 1024; typedef struct { OVERLAPPED overlapped; WSABUF...,包含了指定I/O完成包的指定文件 * __in DWORD NumberOfConcurrentThreads // 真正并发同时执行最大线程数,一般推介是CPU核心数*2 * ); **/ HANDLE...= 0; i < (mySysInfo.dwNumberOfProcessors * 2); ++i) { // 创建服务器工作器线程,并将完成端口传递到该线程 HANDLE ThreadHandle...O使用重叠I/O机制 // 在新建的套接字上投递一个或多个异步 // WSARecv或WSASend请求,这些I/O请求完成后,工作者线程会为I/O请求提供服务 // 单I/O操作数据(I/O重叠)...I/O操作数据 ZeroMemory(&(PerIoData->overlapped), sizeof(OVERLAPPED)); // 清空内存 PerIoData->databuff.len = 1024

    38720

    windows 多线程_关于多线程的技术分享

    = 0; i < 10; i++)  {   g_cArray[i] = 'a';   Sleep(1);  }  // 处理完成后即将事件对象置位  SetEvent(hEvent);  return...= 0; i < 10; i++)  {   g_cArray[10 - i - 1] = 'b';   Sleep(1);  }  // 处理完成后即将事件对象置位  SetEvent(hEvent...在功能上分别相当与Win32 API的PulseEvent()、ResetEvent()、SetEvent()和CloseHandle()等函数。...与前面介绍的几种通过MFC类保持线程同步的方法类似,通过CSemaphore类也可以将前面的线程同步代码进行改写,这两种使用信号量的线程同步方法无论是在实现原理上还是从实现结果上都是完全一致的。...CMutex类也是只含有构造函数这唯一的成员函数,当完成对互斥对象保护资源的访问后,可通过调用从父类CSyncObject继承的UnLock()函数完成对互斥对象的释放。

    70720

    完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三

    (2) 事件内核对象,利用事件内核对象来实现I/O操作完成的通知,其实这种方式其实就是我以前写文章的时候提到的《基于事件通知的重叠I/O模型》,这种机制就先进得多,可以同时等待多个I/O操作的完成,实现真正的异步...64个事件内核对象,也就是说,我们在一个线程内,可以同时监控64个重叠I/O操作的完成状态,当然我们同样可以使用多个线程的方式来满足无限多个重叠I/O的需求,比如如果想要支持3万个连接,就得需要500多个线程...…用起来太麻烦让人感觉不爽; (3) 使用APC( Asynchronous Procedure Call,异步过程调用)来完成,这个也就是我以前在文章里提到的《基于完成例程重叠I/O...最后,我的建议是,想要使用 基于事件通知的重叠I/O和基于完成例程重叠I/O的朋友,如果不是特别必要,就不要去使用了,因为这两种方式不仅使用和理解起来也不算简单,而且还有性能上的明显瓶颈,何不就再努力一下使用完成端口呢...I/O的模型,接收到有数据到达的通知的时候还得自己去另外recv,太低端了……这也是为什么重叠I/O比其他的I/O性能要好的原因之一。

    87980

    驱动开发:通过Async反向与内核通信

    = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) { _pDriverObject->MajorFunction[i] = _DefaultDispatch; }...IoMarkIrpPending 用于标记指定的IRP,标志着某个驱动的分发例程(分发函数)因需要被其他的驱动程序进一步处理最终返回STATUS_PENDING状态。...= 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) { _pDriverObject->MajorFunction[i] = _DefaultDispatch; }...STATUS_SUCCESS; } 驱动层说完了,接下来是应用层,对于应用层来说,需要使用CreateEvent打开通知事件,或者叫做事件对象,然后当有通知时,则直接使用ReadFile读取对应的缓冲区,当所有读取全部结束WaitForMultipleObjects...Buffer[1], 13, &dwRet[1], &ol[1]); ReadFile(hFile, Buffer[2], 13, &dwRet[2], &ol[2]); // 等待三个事件执行完毕 WaitForMultipleObjects

    53410

    基于WDF的PCIPCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)

    例程回调未完成例程回调失败。...EvtIoDeviceControl,当WDF框架处理I/O请求时,根据I/O 请求的副功能码执行相应的操作,I/O 请求处理结束后,需要通过一个例程完成I/O请求,以通知应用程序处理结束。...WDF框架提供三种数据传输方式:  buffered方式:I/O管理器会创建与应用程序数据缓冲区完全相同的系统缓冲区,驱动程序在这个缓冲区工作,由I/O管理器完成复制数据任务;  direct方式:... EvtIoInternalDeeviceControl  EvtIoDefault  下面以完成一个读请求为例,描述WDF框架处理I/O请求的全过程 ?...第1步,应用程序调用Win32 API函数ReadFile进行读操作;第2步,ReadFile函数调用NTDLL.dll中的原生函数NtReadFile,从而进入内核服务,I/O管理器将接管读操作。

    2.4K31

    【Windows网络编程】完成端口IOCP介绍(超详细)

    (2) 事件内核对象,利用事件内核对象来实现I/O操作完成的通知,其实这种方式其实就是我以前写文章的时候提到的《基于事件通知的重叠I/O模型》,链接在这里,这种机制就先进得多,可以同时等待多个I/O操作的完成...Socket,而是这是属于在一个设备内核对象上等待的64个事件内核对象,也就是说,我们在一个线程内,可以同时监控64个重叠I/O操作的完成状态,当然我们同样可以使用多个线程的方式来满足无限多个重叠I/O...,这个也就是我以前在文章里提到的《基于完成例程重叠I/O模型》,链接在这里,这种方式的好处就是在于摆脱了基于事件通知方式的64个事件上限的限制,但是缺点也是有的,就是发出请求的线程必须得要自己去处理接收请求...最后,我的建议是,想要使用 基于事件通知的重叠I/O和基于完成例程重叠I/O的朋友,如果不是特别必要,就不要去使用了,因为这两种方式不仅使用和理解起来也不算简单,而且还有性能上的明显瓶颈,何不就再努力一下使用完成端口呢...I/O的模型,接收到有数据到达的通知的时候还得自己去另外recv,太低端了……这也是为什么重叠I/O比其他的I/O性能要好的原因之一。

    2.5K30

    多线程编程10个例子--1

    三、Win32 API对多线程编程的支持   Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明。...四、Win32 API多线程编程例程 例程1 MultiThread1 建立一个基于对话框的工程MultiThread1,在对话框IDD_MULTITHREAD1_DIALOG中加入两个按钮和一个编辑框...例程2 MultiThread2   该线程演示了如何传送一个一个整型的参数到一个线程中,以及如何等待一个线程完成处理。...例程3 MultiThread3 传送一个结构体给一个线程函数也是可能的,可以通过传送一个指向结构体的指针参数来完成。...用 MFC 类库编程实现工作者线程 例程5 MultiThread5 为了与Win32 API对照,我们使用MFC 类库编程实现例程3 MultiThread3。

    2.5K50
    领券